From bf6432281284e2acc7caa8f84573354a82a75c1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Tr=C3=B6ger?= Date: Fri, 23 Aug 2024 18:44:12 +0200 Subject: [PATCH] no message --- ONVIF Configurator/README.md | 2 +- ONVIF Digital Input/README.md | 2 +- ONVIF Digital Output/README.md | 4 +- ONVIF Discovery/README.md | 2 +- ONVIF Events/README.md | 2 +- ONVIF IO/README.md | 2 +- ONVIF Image Grabber/README.md | 2 +- ONVIF Media Stream/README.md | 2 +- ONVIF Recording/README.md | 113 +++++ .../form.json | 26 +- ONVIF Recording/imgs/Actions.png | Bin 0 -> 7419 bytes ONVIF Recording/imgs/Config.png | Bin 0 -> 18391 bytes ONVIF Recording/locale.json | 18 + .../module.json | 4 +- ONVIF Recording/module.php | 168 ++++++++ ONVIF Replay Stream/locale.json | 34 -- ONVIF Replay Stream/module.php | 406 ------------------ README.md | 9 +- actions/setRecordingState.json | 49 +++ imgs/Module.png | Bin 47394 -> 26173 bytes library.json | 6 +- libs/wsdl.php | 6 +- 22 files changed, 381 insertions(+), 476 deletions(-) create mode 100644 ONVIF Recording/README.md rename {ONVIF Replay Stream => ONVIF Recording}/form.json (95%) create mode 100644 ONVIF Recording/imgs/Actions.png create mode 100644 ONVIF Recording/imgs/Config.png create mode 100644 ONVIF Recording/locale.json rename {ONVIF Replay Stream => ONVIF Recording}/module.json (85%) create mode 100644 ONVIF Recording/module.php delete mode 100644 ONVIF Replay Stream/locale.json delete mode 100644 ONVIF Replay Stream/module.php create mode 100644 actions/setRecordingState.json diff --git a/ONVIF Configurator/README.md b/ONVIF Configurator/README.md index 7ffe854..5fe272a 100644 --- a/ONVIF Configurator/README.md +++ b/ONVIF Configurator/README.md @@ -1,5 +1,5 @@ [![SDK](https://img.shields.io/badge/Symcon-PHPModul-red.svg)](https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/) -[![Version](https://img.shields.io/badge/Modul%20Version-2.13-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) +[![Version](https://img.shields.io/badge/Modul%20Version-2.20-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) [![Version](https://img.shields.io/badge/Symcon%20Version-7.0%20%3E-green.svg)](https://www.symcon.de/service/dokumentation/installation/migrationen/v60-v61-q1-2022/) [![License](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-green.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) [![Check Style](https://github.com/Nall-chan/ONVIF/workflows/Check%20Style/badge.svg)](https://github.com/Nall-chan/ONVIF/actions) diff --git a/ONVIF Digital Input/README.md b/ONVIF Digital Input/README.md index 5537c16..c662b03 100644 --- a/ONVIF Digital Input/README.md +++ b/ONVIF Digital Input/README.md @@ -1,5 +1,5 @@ [![SDK](https://img.shields.io/badge/Symcon-PHPModul-red.svg)](https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/) -[![Version](https://img.shields.io/badge/Modul%20Version-2.13-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) +[![Version](https://img.shields.io/badge/Modul%20Version-2.20-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) [![Version](https://img.shields.io/badge/Symcon%20Version-7.0%20%3E-green.svg)](https://www.symcon.de/service/dokumentation/installation/migrationen/v60-v61-q1-2022/) [![License](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-green.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) [![Check Style](https://github.com/Nall-chan/ONVIF/workflows/Check%20Style/badge.svg)](https://github.com/Nall-chan/ONVIF/actions) diff --git a/ONVIF Digital Output/README.md b/ONVIF Digital Output/README.md index 644ada1..d4d236b 100644 --- a/ONVIF Digital Output/README.md +++ b/ONVIF Digital Output/README.md @@ -1,5 +1,5 @@ [![SDK](https://img.shields.io/badge/Symcon-PHPModul-red.svg)](https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/) -[![Version](https://img.shields.io/badge/Modul%20Version-2.13-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) +[![Version](https://img.shields.io/badge/Modul%20Version-2.20-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) [![Version](https://img.shields.io/badge/Symcon%20Version-7.0%20%3E-green.svg)](https://www.symcon.de/service/dokumentation/installation/migrationen/v60-v61-q1-2022/) [![License](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-green.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) [![Check Style](https://github.com/Nall-chan/ONVIF/workflows/Check%20Style/badge.svg)](https://github.com/Nall-chan/ONVIF/actions) @@ -67,7 +67,7 @@ Die Statusvariablen werden automatisch angelegt und erhalten das `~Switch` Profi ## 6. WebFront -Die Statusvariablen haben eine hinterlegte Standardaktion und somit können die Ausgänge direkt aus dem WebFront bedient werden. +Die Statusvariablen haben eine hinterlegte Standardaktion und somit können die Ausgänge direkt bedient werden. Die direkte Darstellung der Statusvariablen ist möglich; es wird aber empfohlen mit Links zu arbeiten. diff --git a/ONVIF Discovery/README.md b/ONVIF Discovery/README.md index 0a5a240..751aecd 100644 --- a/ONVIF Discovery/README.md +++ b/ONVIF Discovery/README.md @@ -1,5 +1,5 @@ [![SDK](https://img.shields.io/badge/Symcon-PHPModul-red.svg)](https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/) -[![Version](https://img.shields.io/badge/Modul%20Version-2.13-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) +[![Version](https://img.shields.io/badge/Modul%20Version-2.20-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) [![Version](https://img.shields.io/badge/Symcon%20Version-7.0%20%3E-green.svg)](https://www.symcon.de/service/dokumentation/installation/migrationen/v60-v61-q1-2022/) [![License](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-green.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) [![Check Style](https://github.com/Nall-chan/ONVIF/workflows/Check%20Style/badge.svg)](https://github.com/Nall-chan/ONVIF/actions) diff --git a/ONVIF Events/README.md b/ONVIF Events/README.md index aa72fc3..10080cc 100644 --- a/ONVIF Events/README.md +++ b/ONVIF Events/README.md @@ -1,5 +1,5 @@ [![SDK](https://img.shields.io/badge/Symcon-PHPModul-red.svg)](https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/) -[![Version](https://img.shields.io/badge/Modul%20Version-2.13-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) +[![Version](https://img.shields.io/badge/Modul%20Version-2.20-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) [![Version](https://img.shields.io/badge/Symcon%20Version-7.0%20%3E-green.svg)](https://www.symcon.de/service/dokumentation/installation/migrationen/v60-v61-q1-2022/) [![License](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-green.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) [![Check Style](https://github.com/Nall-chan/ONVIF/workflows/Check%20Style/badge.svg)](https://github.com/Nall-chan/ONVIF/actions) diff --git a/ONVIF IO/README.md b/ONVIF IO/README.md index 60d8a76..04ef6fa 100644 --- a/ONVIF IO/README.md +++ b/ONVIF IO/README.md @@ -1,5 +1,5 @@ [![SDK](https://img.shields.io/badge/Symcon-PHPModul-red.svg)](https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/) -[![Version](https://img.shields.io/badge/Modul%20Version-2.13-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) +[![Version](https://img.shields.io/badge/Modul%20Version-2.20-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) [![Version](https://img.shields.io/badge/Symcon%20Version-7.0%20%3E-green.svg)](https://www.symcon.de/service/dokumentation/installation/migrationen/v60-v61-q1-2022/) [![License](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-green.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) [![Check Style](https://github.com/Nall-chan/ONVIF/workflows/Check%20Style/badge.svg)](https://github.com/Nall-chan/ONVIF/actions) diff --git a/ONVIF Image Grabber/README.md b/ONVIF Image Grabber/README.md index e6e4cf1..25107a5 100644 --- a/ONVIF Image Grabber/README.md +++ b/ONVIF Image Grabber/README.md @@ -1,5 +1,5 @@ [![SDK](https://img.shields.io/badge/Symcon-PHPModul-red.svg)](https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/) -[![Version](https://img.shields.io/badge/Modul%20Version-2.13-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) +[![Version](https://img.shields.io/badge/Modul%20Version-2.20-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) [![Version](https://img.shields.io/badge/Symcon%20Version-7.0%20%3E-green.svg)](https://www.symcon.de/service/dokumentation/installation/migrationen/v60-v61-q1-2022/) [![License](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-green.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) [![Check Style](https://github.com/Nall-chan/ONVIF/workflows/Check%20Style/badge.svg)](https://github.com/Nall-chan/ONVIF/actions) diff --git a/ONVIF Media Stream/README.md b/ONVIF Media Stream/README.md index 3b048f8..7014152 100644 --- a/ONVIF Media Stream/README.md +++ b/ONVIF Media Stream/README.md @@ -1,5 +1,5 @@ [![SDK](https://img.shields.io/badge/Symcon-PHPModul-red.svg)](https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/) -[![Version](https://img.shields.io/badge/Modul%20Version-2.13-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) +[![Version](https://img.shields.io/badge/Modul%20Version-2.20-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) [![Version](https://img.shields.io/badge/Symcon%20Version-7.0%20%3E-green.svg)](https://www.symcon.de/service/dokumentation/installation/migrationen/v60-v61-q1-2022/) [![License](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-green.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) [![Check Style](https://github.com/Nall-chan/ONVIF/workflows/Check%20Style/badge.svg)](https://github.com/Nall-chan/ONVIF/actions) diff --git a/ONVIF Recording/README.md b/ONVIF Recording/README.md new file mode 100644 index 0000000..6c88e24 --- /dev/null +++ b/ONVIF Recording/README.md @@ -0,0 +1,113 @@ +[![SDK](https://img.shields.io/badge/Symcon-PHPModul-red.svg)](https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/) +[![Version](https://img.shields.io/badge/Modul%20Version-2.20-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) +[![Version](https://img.shields.io/badge/Symcon%20Version-7.0%20%3E-green.svg)](https://www.symcon.de/service/dokumentation/installation/migrationen/v60-v61-q1-2022/) +[![License](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-green.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) +[![Check Style](https://github.com/Nall-chan/ONVIF/workflows/Check%20Style/badge.svg)](https://github.com/Nall-chan/ONVIF/actions) +[![Run Tests](https://github.com/Nall-chan/ONVIF/workflows/Run%20Tests/badge.svg)](https://github.com/Nall-chan/ONVIF/actions) +[![Spenden](https://www.paypalobjects.com/de_DE/DE/i/btn/btn_donate_SM.gif)](#3-spenden)[![Wunschliste](https://img.shields.io/badge/Wunschliste-Amazon-ff69fb.svg)](#3-spenden) + +# ONVIF Recording +Anzeige uns Steuerung von Aufnahmen. + +## Inhaltsverzeichnis + +- [1. Funktionsumfang](#1-funktionsumfang) +- [2. Voraussetzungen](#2-voraussetzungen) +- [3. Software-Installation](#3-software-installation) +- [4. Einrichten der Instanzen in IP-Symcon](#4-einrichten-der-instanzen-in-ip-symcon) +- [5. Statusvariablen](#5-statusvariablen) +- [6. WebFront](#6-webfront) +- [7. PHP-Funktionsreferenz](#7-php-funktionsreferenz) +- [8. Aktionen](#8-aktionen) +- [9. Anhang](#9-anhang) + - [1. Changelog](#1-changelog) + - [2. Spenden](#2-spenden) +- [10. Lizenz](#10-lizenz) + +## 1. Funktionsumfang + +* Instanz für die einfache Anzeige und Steuerung von Aufzeichnungen welche durch die Geräten selbstständig verwaltet werden. + +## 2. Voraussetzungen + +* IP-Symcon ab Version 6.1 +* Kameras oder Video-Encoder mit ONVIF Profil G und eingerichteter Aufzeichnung. + +## 3. Software-Installation + +* Dieses Modul ist Bestandteil der [ONVIF-Library](../README.md#3-software-installation). + +## 4. Einrichten der Instanzen in IP-Symcon + + Unter 'Instanz hinzufügen' ist das 'ONVIF Recording'-Modul unter dem Hersteller 'ONVIF' aufgeführt. +![Module](../imgs/Module.png) + + Es wird empfohlen diese Instanz über die dazugehörige Instanz des [Configurator-Moduls](../ONVIF%20Configurator/README.md) von diesem Geräte anzulegen. + +__Konfigurationsseite__: + +![Config](imgs/Config.png) + +| Name | Text | Beschreibung | +| ----------- | -------------------------- | ------------------------------------------------------------------------------------------------------------- | +| EventTopic | Ereignisse für die Aufzeichnung | Auswahl des Ereignis-Pfad für Recording-Jobs (*). | +| EmulateStatus | Status simulieren | Wenn aktiviert, wird die Statusvariable in Symcon auf den neuen Wert gesetzt, sobald ein Steuerbefehl erfolgreich übertragen wurde. Sonst wird nur über ankommende Ereignisse gesetzt. | + +(*) _Durch eine Änderung des Ereignis-Pfad werden die alten Statusvariablen hinfällig und müssen manuell gelöscht werden._ + +Der Ereignis-Pfad wird für Recordings Jobs versucht automatisch zu erkennen, funktioniert dies nicht, ist das Eingabefeld aktiv und das Ereignis muss manuell ausgewählt werden. + +## 5. Statusvariablen + +Die Statusvariablen werden automatisch angelegt und erhalten das `~Switch` Profil. Das Löschen einzelner Statusvariablen kann zu Fehlfunktionen führen. + +| Name | Typ | Beschreibung | +| --------------------------------------------------- | ---- | -------------------------------------------------------------------------- | +| je nach Name des RecordingJob-Token aus dem Onvif-Ereignis | bool | Für jeden bekannten Job wird eine passende Variable in Symcon erstellt. | + +## 6. WebFront + +Die Statusvariablen haben eine hinterlegte Standardaktion und somit können die Aufnahmen direkt bedient werden. + +Die direkte Darstellung der Statusvariablen ist möglich; es wird aber empfohlen mit Links zu arbeiten. + +## 7. PHP-Funktionsreferenz + +``` php +boolean ONVIF_SetRecordingJobMode(integer $InstanzID, string $Ident, bool $State) +``` +Startet oder Beendet die in `$Ident` übergeben Aufnahme, je nach übergebenen Wert in `$Value`. +Konnte der Befehl erfolgreich ausgeführt werden, wird `TRUE` zurückgegeben. +Im Fehlerfall wird eine Warnung erzeugt und `FALSE` zurückgegeben. + +Beispiel: +`ONVIF_SetRecordingJobMode(12345, 'JobStateRecJob_Cam1Rec0', false);` +Beendet die Aufzeichnung `RecJob_Cam1Rec0`. + +## 8. Aktionen + +__Grundsätzlich können alle bedienbaren Statusvariablen als Ziel einer [`Aktion`](https://www.symcon.de/service/dokumentation/konzepte/automationen/ablaufplaene/aktionen/) mit 'Auf Wert schalten' angesteuert werden, so das hier keine speziellen Aktionen benutzt werden müssen.__ + +Dennoch gibt es eine Aktion für die 'ONVIF Recording' Instanz. +Wenn so eine Instanz als Ziel einer Aktion ausgewählt wurde, steht folgende Aktion zur Verfügung: +![Aktionen](imgs/Actions.png) +* Starten oder Stoppen einer Aufzeichnung + +## 9. Anhang + +### 1. Changelog + +[Changelog der Library](../README.md#2-changelog) + +### 2. Spenden + + Die Library ist für die nicht kommerzielle Nutzung kostenlos, Schenkungen als Unterstützung für den Autor werden hier akzeptiert: + + + +[![Wunschliste](https://img.shields.io/badge/Wunschliste-Amazon-ff69fb.svg)](https://www.amazon.de/hz/wishlist/ls/YU4AI9AQT9F?ref_=wl_share) + +## 10. Lizenz + + IPS-Modul: + [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/) diff --git a/ONVIF Replay Stream/form.json b/ONVIF Recording/form.json similarity index 95% rename from ONVIF Replay Stream/form.json rename to ONVIF Recording/form.json index 5ad9d30..ce2cc10 100644 --- a/ONVIF Replay Stream/form.json +++ b/ONVIF Recording/form.json @@ -1,20 +1,5 @@ { "elements": [ - { - "type": "Select", - "name": "VideoSource", - "caption": "Videosource", - "width": "300px", - "options": [], - "onChange": "IPS_RequestAction($id,'RefreshRecordingTokenForm',$VideoSource);" - }, - { - "type": "Select", - "name": "RecordingToken", - "caption": "Recording", - "width": "300px", - "options": [] - }, { "type": "Select", "name": "EventTopic", @@ -22,6 +7,11 @@ "width": "300px", "options": [], "enabled": false + }, + { + "name": "EmulateStatus", + "type": "CheckBox", + "caption": "Emulate Status" } ], "actions": [ @@ -54,12 +44,12 @@ { "code": 104, "icon": "inactive", - "caption": "Configuration is invalid" + "caption": "Event missing" }, { "code": 201, "icon": "error", - "caption": "Snapshot URL could not be determined" + "caption": "Event not valid" } ] -} +} \ No newline at end of file diff --git a/ONVIF Recording/imgs/Actions.png b/ONVIF Recording/imgs/Actions.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1756305e73008cca3f9a57792e79ab9f8e5db8 GIT binary patch literal 7419 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 literal 0 HcmV?d00001 diff --git a/ONVIF Recording/locale.json b/ONVIF Recording/locale.json new file mode 100644 index 0000000..9cdfbd9 --- /dev/null +++ b/ONVIF Recording/locale.json @@ -0,0 +1,18 @@ +{ + "translations": { + "de": { + "Events of recording": "Ereignisse für die Aufzeichnung", + "Emulate Status": "Status simulieren", + "Configuration is valid": "Konfiguration ist gültig", + "Event missing": "Ereignis fehlt", + "Event not valid": "Ereignis ist nicht gültig", + "none": "keine", + "nothing": "keins", + "Device has no xAddr for this service.": "Gerät hat keine xAddr für diesen Dienst.", + "Instance has no active parent.": "Instanz hat kein aktives übergeordnetes Element.", + "Unknown error.": "Unbekannter Fehler.", + "No valid answer.": "Keine gültige Antwort.", + "This module is free for non-commercial use,\r\nDonations in support of the author are accepted here:": "Dieses Modul ist für die nicht kommerzielle Nutzung kostenlos,\r\nSchenkungen als Unterstützung für den Autor werden hier akzeptiert:" + } + } +} \ No newline at end of file diff --git a/ONVIF Replay Stream/module.json b/ONVIF Recording/module.json similarity index 85% rename from ONVIF Replay Stream/module.json rename to ONVIF Recording/module.json index db474cb..806b760 100644 --- a/ONVIF Replay Stream/module.json +++ b/ONVIF Recording/module.json @@ -1,6 +1,6 @@ { "id": "{24EE27C1-F77B-4EEE-9C9E-C53C674EFF47}", - "name": "ONVIF Replay Stream", + "name": "ONVIF Recording", "type": 3, "vendor": "ONVIF", "aliases": [], @@ -12,5 +12,5 @@ "{E23DD2CD-F098-268A-CE49-1CC04FE8060B}" ], "prefix": "ONVIF", - "url": "https://github.com/Nall-chan/ONVIF/blob/master/ONVIF%20Replay%20Stream/README.md" + "url": "https://github.com/Nall-chan/ONVIF/blob/master/ONVIF%20Recording/README.md" } \ No newline at end of file diff --git a/ONVIF Recording/module.php b/ONVIF Recording/module.php new file mode 100644 index 0000000..c67af21 --- /dev/null +++ b/ONVIF Recording/module.php @@ -0,0 +1,168 @@ +RegisterPropertyBoolean(\ONVIF\Recording\Property::EmulateStatus, false); + $this->Capabilities = []; + } + + public function GetConfigurationForm(): string + { + $Form = json_decode(file_get_contents(__DIR__ . '/form.json'), true); + if ($this->GetStatus() == IS_CREATING) { + return json_encode($Form); + } + $Form['elements'][0] = $this->GetConfigurationFormEventTopic($Form['elements'][0]); + $this->SendDebug('FORM', json_encode($Form), 0); + $this->SendDebug('FORM', json_last_error_msg(), 0); + return json_encode($Form); + } + + public function RequestAction(string $Ident, mixed $Value, bool &$done = false): void + { + parent::RequestAction($Ident, $Value, $done); + if ($done) { + return; + } + if (stripos($Ident, 'JobState') === 0) { + $this->SetRecordingJobMode($Ident, (bool) $Value); + } + return; + } + + public function ReceiveData(string $JSONString): string + { + $Data = json_decode($JSONString, true); + unset($Data['DataID']); + $this->SendDebug('ReceiveEvent', $Data, 0); + $EventProperties = $this->ReadAttributeArray(\ONVIF\Device\Attribute::EventProperties); + $EventProperty = array_pop($EventProperties); + $SourceIndex = array_search('tt:RecordingJobReference', array_column($EventProperty['Sources'], 'Type')); + if ($SourceIndex === false) { + return ''; + } + $SourceName = $EventProperty['Sources'][$SourceIndex]['Name']; + $EventSourceIndex = array_search($SourceName, array_column($Data['Sources'], 'Name')); + if ($EventSourceIndex === false) { + return ''; + } + $Ident = 'JobState' . $Data['Sources'][$EventSourceIndex]['Value']; + $Name = 'JobState:' . $Data['Sources'][$EventSourceIndex]['Value']; + $DataName = $EventProperty['Data'][$SourceIndex]['Name']; + $EventDataIndex = array_search($DataName, array_column($Data['DataValues'], 'Name')); + if ($EventDataIndex === false) { + return ''; + } + $Value = $Data['DataValues'][$EventDataIndex]['Value']; + $this->RegisterVariableBoolean($Ident, $Name, '~Switch', 0); + $this->EnableAction($Ident); + $this->SetValueBoolean($Ident, (strtolower($Value) == 'active')); + return ''; + } + + public function SetRecordingJobMode(string $Ident, bool $State): bool + { + if (stripos($Ident, 'JobState') === 0) { + $JobToken = substr($Ident, 8); + } else { + return false; + } + $Capabilities = $this->Capabilities; + $Params = [ + 'JobToken' => $JobToken, + 'Mode' => $State ? 'Active' : 'Idle' + ]; + $SetRecordingJobModeResult = $this->SendData($Capabilities['XAddr'][\ONVIF\NS::Recording], 'SetRecordingJobMode', true, $Params); + if ($SetRecordingJobModeResult) { + if (($this->ReadPropertyBoolean(\ONVIF\Output\Property::EmulateStatus))) { + $Ident = 'JobState' . $JobToken; + $Name = 'JobState:' . $JobToken; + $this->RegisterVariableBoolean($Ident, $Name, '~Switch', 0); + $this->EnableAction($Ident); + $this->SetValueBoolean($Ident, $State); + } + return true; + } + return false; + } + + protected function InitFilterAndEvents(): void + { + parent::InitFilterAndEvents(); + if ($this->ReadPropertyString(\ONVIF\Device\Property::EventTopic) == '') { + $this->SetStatus(IS_INACTIVE); + return; + } + if (IPS_GetKernelRunlevel() != KR_READY) { + return; + } + if ($this->HasActiveParent()) { + $this->Capabilities = @$this->GetCapabilities(); + if (!$this->Capabilities) { + $this->SetStatus(IS_EBASE + 1); + return; + } + $Events = $this->ReadAttributeArray(\ONVIF\Device\Attribute::EventProperties); + if (!count($Events)) { + $this->SetStatus(IS_EBASE + 1); + } else { + $this->SetStatus(IS_ACTIVE); + $this->GetRecordingJobs(); + } + return; + } + $this->SetStatus(IS_ACTIVE); + } + + protected function GetRecordingJobs(): bool + { + $Capabilities = $this->Capabilities; + $RecordingJobsResult = $this->SendData($Capabilities['XAddr'][\ONVIF\NS::Recording], 'GetRecordingJobs', true); + if (is_bool($RecordingJobsResult)) { + return $RecordingJobsResult; + } + if (!is_array($RecordingJobsResult->JobItem)) { + $RecordingJobs = []; + $RecordingJobs[] = json_decode(json_encode($RecordingJobsResult->JobItem), true); + } else { + $RecordingJobs = json_decode(json_encode($RecordingJobsResult->JobItem), true); + } + foreach ($RecordingJobs as $RecordingJob) { + $this->GetRecordingJobState($RecordingJob['JobToken']); + } + return true; + } + + protected function GetRecordingJobState(string $JobToken): bool + { + $Capabilities = $this->Capabilities; + $Params = [ + 'JobToken' => $JobToken + ]; + $GetRecordingJobStateResult = $this->SendData($Capabilities['XAddr'][\ONVIF\NS::Recording], 'GetRecordingJobState', true, $Params); + if ($GetRecordingJobStateResult == false) { + return false; + } + $Value = $GetRecordingJobStateResult->State->State; + $Ident = 'JobState' . $JobToken; + $Name = 'JobState:' . $JobToken; + $this->RegisterVariableBoolean($Ident, $Name, '~Switch', 0); + $this->EnableAction($Ident); + $this->SetValueBoolean($Ident, (strtolower($Value) == 'active')); + return true; + } + +} diff --git a/ONVIF Replay Stream/locale.json b/ONVIF Replay Stream/locale.json deleted file mode 100644 index e6cc07a..0000000 --- a/ONVIF Replay Stream/locale.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "translations": { - "de": { - "Videosource": "Videoquelle", - "Stream-Profile": "Stream-Profil", - "Events of videosource": "Ereignisse der Videoquelle", - "Configuration is valid": "Konfiguration ist gültig", - "Configuration is invalid": "Konfiguration ist ungültig", - "Snapshot URL could not be determined": "Snapshot URL konnte nicht bestimmt werden", - "Error on read capabilities.": "Fehler beim Lesen der Fähigkeiten.", - "Device has no xAddr for this service.": "Gerät hat keine xAddr für diesen Dienst.", - "Instance has no active parent.": "Instanz hat kein aktives übergeordnetes Element.", - "Unknown error.": "Unbekannter Fehler.", - "No valid answer.": "Keine gültige Antwort.", - "none": "keine", - "nothing": "keins", - "Videoencoder-Profilename:": "Videoencoder-Profilname:", - "Videosource-Name:": "Videoquellen-Name:", - "Resolution:": "Auflösung:", - "Framerate:": "Bildrate:", - "Encoding-Interval:": "Kodierungsintervall:", - "Bitratelimit:": "Bitraten-Limit", - "Invalid parameters.": "Ungültige Parameter.", - "Stream properties": "Stream Eigenschaften", - "Show Image": "Zeige Bild", - "This options should not be disabled for SymBox or SD/SSD media": "Diese Option sollte nicht für die SymBox oder SD/SSD Speichermedien deaktiviert werden", - "Use in-memory cache": "Benutze In-Memory Cache", - "Update Image": "Jetzt aktualisieren", - "seconds": "Sekunden", - "Image": "Bild", - "This module is free for non-commercial use,\r\nDonations in support of the author are accepted here:": "Dieses Modul ist für die nicht kommerzielle Nutzung kostenlos,\r\nSchenkungen als Unterstützung für den Autor werden hier akzeptiert:" - } - } -} \ No newline at end of file diff --git a/ONVIF Replay Stream/module.php b/ONVIF Replay Stream/module.php deleted file mode 100644 index ff457d8..0000000 --- a/ONVIF Replay Stream/module.php +++ /dev/null @@ -1,406 +0,0 @@ -RegisterPropertyString(\ONVIF\Replay\Property::VideoSource, ''); - $this->RegisterPropertyString(\ONVIF\Replay\Property::RecordingToken, ''); - $this->Recordings = []; - $this->Capabilities = []; - } - - public function GetConfigurationForm(): string - { - $Form = json_decode(file_get_contents(__DIR__ . '/form.json'), true); - if ($this->GetStatus() == IS_CREATING) { - return json_encode($Form); - } - if (!$this->HasActiveParent() || ($this->ParentID == 0)) { - $Form['actions'][] = [ - 'type' => 'PopupAlert', - 'popup' => [ - 'items' => [[ - 'type' => 'Label', - 'caption' => 'Instance has no active parent.' - ]] - ] - ]; - $this->SendDebug('FORM', json_encode($Form), 0); - $this->SendDebug('FORM', json_last_error_msg(), 0); - return json_encode($Form); - } - $Recordings = $this->Recordings; - if (!count($Recordings)) { - $Recordings = @$this->GetRecordings(); - } - - if ($Recordings == false) { - $Form['actions'][] = [ - 'type' => 'PopupAlert', - 'popup' => [ - 'items' => [[ - 'type' => 'Label', - 'caption' => 'Error on read recordings.' - ]] - ] - ]; - $this->SendDebug('FORM', json_encode($Form), 0); - $this->SendDebug('FORM', json_last_error_msg(), 0); - return json_encode($Form); - } - $VideoSourcesOptions = []; - $RecordingOptions = []; - $RecordingOptions[] = [ - 'caption' => 'none', - 'value' => '' - ]; - $ActualRecording = null; - foreach ($Recordings as $VideoSource => $SourceRecordings) { - $VideoSourcesOptions[] = [ - 'caption' => $VideoSource, - 'value' => $VideoSource - ]; - if ($this->ReadPropertyString(\ONVIF\Replay\Property::VideoSource) == $VideoSource) { - foreach ($SourceRecordings as $RecordingToken) { - $RecordingOptions[] = [ - 'caption' => $RecordingToken, - 'value' => $RecordingToken - ]; - if ($this->ReadPropertyString(\ONVIF\Replay\Property::RecordingToken) == $RecordingToken) { - $ActualRecording = $RecordingToken; - } - } - } - } - $Form['elements'][0]['options'] = $VideoSourcesOptions; - $Form['elements'][1]['options'] = $RecordingOptions; - $Form['elements'][2] = $this->GetConfigurationFormEventTopic($Form['elements'][2]); - $this->SendDebug('ActualRecording', $ActualRecording, 0); - $this->SendDebug('FORM', json_encode($Form), 0); - $this->SendDebug('FORM', json_last_error_msg(), 0); - return json_encode($Form); - } - - public function RequestAction(string $Ident, mixed $Value, bool &$done = false): void - { - parent::RequestAction($Ident, $Value, $done); - if ($done) { - return; - } - switch ($Ident) { - case 'RefreshRecordingTokenForm': - $this->RefreshRecordingTokenForm($Value); - return; - } - if (stripos($Ident, 'JobState') === 0) { - $this->SetRecordingJobMode(substr($Ident, 8), (bool) $Value); - } - $this->SendDebug('Ident', $Ident, 0); - /* - if (stripos($Ident, 'JobConfig') === 0 ){ - $this->SetRelayOutputState(substr($Ident,9), (bool)$Value); - } - */ - return; - } - - public function ReceiveData(string $JSONString): string - { - $Data = json_decode($JSONString, true); - unset($Data['DataID']); - $this->SendDebug('ReceiveEvent', $Data, 0); - $EventProperties = $this->ReadAttributeArray(\ONVIF\Device\Attribute::EventProperties); - $EventProperty = array_pop($EventProperties); - $SourceIndex = array_search('tt:RecordingJobReference', array_column($EventProperty['Sources'], 'Type')); - if ($SourceIndex === false) { - return ''; - } - $SourceName = $EventProperty['Sources'][$SourceIndex]['Name']; - $EventSourceIndex = array_search($SourceName, array_column($Data['Sources'], 'Name')); - if ($EventSourceIndex === false) { - return ''; - } - $Ident = 'JobState' . $Data['Sources'][$EventSourceIndex]['Value']; - $Name = 'JobState:' . $Data['Sources'][$EventSourceIndex]['Value']; - $DataName = $EventProperty['Data'][$SourceIndex]['Name']; - $EventDataIndex = array_search($DataName, array_column($Data['DataValues'], 'Name')); - if ($EventDataIndex === false) { - return ''; - } - $Value = $Data['DataValues'][$EventDataIndex]['Value']; - $this->RegisterVariableBoolean($Ident, $Name, '~Switch', 0); - $this->EnableAction($Ident); - $this->SetValueBoolean($Ident, (strtolower($Value) == 'active')); - return ''; - } - - protected function InitFilterAndEvents(): void - { - parent::InitFilterAndEvents(); - $this->Capabilities = @$this->GetCapabilities(); - @$this->GetRecordings(); - if ($this->ReadPropertyString(\ONVIF\Replay\Property::VideoSource) == '') { - $this->SetStatus(IS_INACTIVE); - $this->SetMedia(''); - return; - } - if ($this->ReadPropertyString(\ONVIF\Replay\Property::RecordingToken) == '') { - $this->SetStatus(IS_INACTIVE); - $this->SetMedia(''); - return; - } - if (IPS_GetKernelRunlevel() != KR_READY) { - return; - } - /** - * @todo - */ - $this->GetRecordingSummary(); - //$this->GetRecordingInformation(); - //$this->GetReplayConfiguration(); - $this->GetRecordingJobs(); - //$this->GetRecordingConfiguration(); - //$this->GetRecordingOptions(); - if (count($this->Recordings)) { - $StreamURL = $this->GetStreamUri(); - if ($StreamURL) { - $this->SetMedia($StreamURL); - $this->SetStatus(IS_ACTIVE); - } else { - $this->SetMedia(''); - $this->SetStatus(IS_EBASE + 1); - } - } - } - - protected function RefreshRecordingTokenForm(string $NewVideoSource): void - { - $Recordings = $this->Recordings; - $RecordingOptions = []; - $RecordingOptions[] = [ - 'caption' => 'none', - 'value' => '' - ]; - foreach ($Recordings as $VideoSource => $SourceRecordings) { - if ($NewVideoSource == $VideoSource) { - foreach ($SourceRecordings as $RecordingToken) { - $ProfileOptions[] = [ - 'caption' => $RecordingToken, - 'value' => $RecordingToken - ]; - } - } - } - $this->UpdateFormField('RecordingToken', 'options', json_encode($ProfileOptions)); - } - - protected function GetRecordingSummary(): bool - { - $Capabilities = $this->Capabilities; - $Result = $this->SendData($Capabilities['XAddr'][\ONVIF\NS::SearchRecording], 'GetRecordingSummary', true, [], \ONVIF\WSDL::SearchRecording); - if ($Result == false) { - return false; - } - return true; - } - /* - protected function GetRecordingInformation() - { - $Capabilities = $this->Capabilities; - $Params = [ - 'RecordingToken' => $this->ReadPropertyString(\ONVIF\Replay\Property::RecordingToken) - ]; - $Result = $this->SendData($Capabilities['XAddr'][\ONVIF\NS::SearchRecording], 'GetRecordingInformation', true, $Params,\ONVIF\WSDL::SearchRecording); - if ($Result == false) { - return false; - } - } - */ - /* - protected function GetReplayConfiguration(){ - $Capabilities = $this->Capabilities; - $Result = $this->SendData($Capabilities['XAddr'][\ONVIF\NS::Replay], 'GetReplayConfiguration', true); - if ($Result == false) { - return false; - } - } - */ - - protected function GetRecordingJobs(): bool - { - $Capabilities = $this->Capabilities; - $RecordingJobsResult = $this->SendData($Capabilities['XAddr'][\ONVIF\NS::Recording], 'GetRecordingJobs', true, [], \ONVIF\WSDL::Recording); - if (is_bool($RecordingJobsResult)) { - return $RecordingJobsResult; - } - if (!is_array($RecordingJobsResult->JobItem)) { - $RecordingJobs = []; - $RecordingJobs[] = json_decode(json_encode($RecordingJobsResult->JobItem), true); - } else { - $RecordingJobs = json_decode(json_encode($RecordingJobsResult->JobItem), true); - } - - foreach ($RecordingJobs as $RecordingJob) { - /*$Ident = 'JobConfig'.$RecordingJob['JobConfiguration']['RecordingToken']; - $Name = 'JobConfiguration:'.$RecordingJob['JobConfiguration']['RecordingToken']; - $Value = $RecordingJob['JobConfiguration']['Mode']; - $this->RegisterVariableBoolean($Ident, $Name, '~Switch', 0); - $this->EnableAction($Ident); - $this->SetValueBoolean($Ident, (strtolower($Value) == 'active'));*/ - $this->GetRecordingJobState($RecordingJob['JobConfiguration']['RecordingToken']); - } - return true; - } - - protected function GetRecordingJobState(string $JobToken): bool - { - $Capabilities = $this->Capabilities; - $Params = [ - 'JobToken' => $JobToken - ]; - $GetRecordingJobStateResult = $this->SendData($Capabilities['XAddr'][\ONVIF\NS::Recording], 'GetRecordingJobState', true, $Params, \ONVIF\WSDL::Recording); - if ($GetRecordingJobStateResult == false) { - return false; - } - $Value = $GetRecordingJobStateResult->State->State; - $Ident = 'JobState' . $JobToken; - $Name = 'JobState:' . $JobToken; - $this->RegisterVariableBoolean($Ident, $Name, '~Switch', 0); - $this->EnableAction($Ident); - $this->SetValueBoolean($Ident, (strtolower($Value) == 'active')); - return true; - } - - protected function SetRecordingJobMode(string $JobToken, bool $State): bool - { - $Capabilities = $this->Capabilities; - $Params = [ - 'JobToken' => $JobToken, - 'Mode' => $State ? 'Active' : 'Idle' - ]; - $SetRecordingJobModeResult = $this->SendData($Capabilities['XAddr'][\ONVIF\NS::Recording], 'SetRecordingJobMode', true, $Params, \ONVIF\WSDL::Recording); - if ($SetRecordingJobModeResult) { - $Ident = 'JobState' . $JobToken; - $Name = 'JobState:' . $JobToken; - $this->RegisterVariableBoolean($Ident, $Name, '~Switch', 0); - $this->EnableAction($Ident); - $this->SetValueBoolean($Ident, $State); - return true; - } - return false; - } - /* - protected function GetRecordingConfiguration(){ - $Capabilities = $this->Capabilities; - $Params = [ - 'RecordingToken' => $this->ReadPropertyString(\ONVIF\Replay\Property::RecordingToken) - ]; - $Result = $this->SendData($Capabilities['XAddr'][\ONVIF\NS::Recording], 'GetRecordingConfiguration', true, $Params,\ONVIF\WSDL::Recording); - if ($Result == false) { - return false; - } - }*/ - - /* - protected function GetRecordingOptions(){ - $Capabilities = $this->Capabilities; - $Params = [ - 'RecordingToken' => $this->ReadPropertyString(\ONVIF\Replay\Property::RecordingToken) - ]; - $Result = $this->SendData($Capabilities['XAddr'][\ONVIF\NS::Recording], 'GetRecordingOptions', true, $Params,\ONVIF\WSDL::Recording); - if ($Result == false) { - return false; - } - } - */ - - protected function GetRecordings(): false|array - { - $Recordings = []; - $this->Recordings = $Recordings; - $Capabilities = $this->Capabilities; - $Result = $this->SendData($Capabilities['XAddr'][\ONVIF\NS::Recording], 'GetRecordings', true, [], \ONVIF\WSDL::Recording); - if ($Result == false) { - return false; - } - $RecordingsResult = json_decode(json_encode($Result), true); - if (!isset($RecordingsResult['RecordingItem'])) { - return false; - } - foreach ($RecordingsResult['RecordingItem'] as $RecordingItem) { - if ($RecordingItem['Configuration']['MaximumRetentionTime'] == 'PT0S') { - continue; - } - $Recordings[$RecordingItem['Configuration']['Source']['Name']][] = $RecordingItem['RecordingToken']; - } - $this->Recordings = $Recordings; - $this->SendDebug('Recordings', $Recordings, 0); - return $Recordings; - } - - /** - * Todo - */ - protected function GetStreamUri(): false|string - { - $Capabilities = $this->Capabilities; - $Params = [ - 'StreamSetup' => [ - 'Stream' => 'RTP-Unicast', - 'Transport' => [ - 'Protocol' => 'RTSP', - ], - ], - 'RecordingToken' => $this->ReadPropertyString(\ONVIF\Replay\Property::RecordingToken) - ]; - $Result = $this->SendData($Capabilities['XAddr'][\ONVIF\NS::Replay], 'GetReplayUri', true, $Params); - if ($Result == false) { - return false; - } - $GetReplayUriResult = json_decode(json_encode($Result), true); - if (!isset($GetReplayUriResult['Uri'])) { - return false; - } - $Uri = parse_url($GetReplayUriResult['Uri']); - - $Credentials = $this->GetCredentials(); - $Uri['host'] = parse_url($this->GetUrl(), PHP_URL_HOST); - if (($Credentials['Username'] != '') || ($Credentials['Password'] != '')) { - $Uri['user'] = $Credentials['Username']; - $Uri['pass'] = $Credentials['Password']; - } - $MediaURL = self::unparse_url($Uri); - $this->SendDebug('MediaURL', $MediaURL, 0); - return $MediaURL; - } - - protected function SetMedia($StreamURL): void - { - IPS_SetMediaFile($this->GetMediaId(), $StreamURL, false); - } - - protected function GetMediaId(): int - { - $MediaId = @$this->GetIDForIdent('STREAM'); - if ($MediaId == false) { - $MediaId = IPS_CreateMedia(MEDIATYPE_STREAM); - IPS_SetParent($MediaId, $this->InstanceID); - IPS_SetName($MediaId, $this->Translate('Stream')); - IPS_SetIdent($MediaId, 'STREAM'); - } - return $MediaId; - } -} diff --git a/README.md b/README.md index 6c5400f..6656c90 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![SDK](https://img.shields.io/badge/Symcon-PHPModul-red.svg)](https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/) -[![Version](https://img.shields.io/badge/Modul%20Version-2.13-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) +[![Version](https://img.shields.io/badge/Modul%20Version-2.20-blue.svg)](https://community.symcon.de/t/modul-onvif-profil-s-fuer-ip-kameras-und-encoder/52036) [![Version](https://img.shields.io/badge/Symcon%20Version-7.0%20%3E-green.svg)](https://www.symcon.de/service/dokumentation/installation/migrationen/v60-v61-q1-2022/) [![License](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-green.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) [![Check Style](https://github.com/Nall-chan/ONVIF/workflows/Check%20Style/badge.svg)](https://github.com/Nall-chan/ONVIF/actions) @@ -135,11 +135,18 @@ Für das Discovery werden Pakete über die Multicast-Adresse `239.255.255.250` a | ONVIF Events | Gerät | ONVIF | {62584C2E-4542-4EBF-1E92-299F4CF364E4} | | ONVIF Input | Gerät | ONVIF | {73097230-1ECC-FEEB-5969-C85148DFA76E} | | ONVIF Output | Gerät | ONVIF | {A44B3114-1F72-1FD1-96FB-D7E970BD8614} | +| ONVIF Recording | Gerät | ONVIF | {24EE27C1-F77B-4EEE-9C9E-C53C674EFF47} | ---------- ### 2. Changelog +**Version 2.20** + - Voraussetzung für IP-Symcon Version 7.0 oder neuer. + - IO zeigt unter Geräteinformationen die Scopes und Adressen der Services an. + - Unterstützung für Profil G (Recording). + - Neue Instanz `ONVIF Recording`. + **Version 2.17** - Weitere Prüfungen in der Auswertungen von Gerätefähigkeiten eingebaut um Fehler vorzubeugen. diff --git a/actions/setRecordingState.json b/actions/setRecordingState.json new file mode 100644 index 0000000..59983a7 --- /dev/null +++ b/actions/setRecordingState.json @@ -0,0 +1,49 @@ +{ + "id": "{93A6C580-16C1-4AB5-9BFC-38B9E63C96FE}", + "caption": "Start or stop recording", + "form": [ + "$Childs = IPS_GetChildrenIDs($_IPS['TARGET']);", + "$Form = ['type' => 'Select', 'name' => 'IDENT', 'caption' => 'Recording job','options'=>[]];", + "foreach ($Childs as $VarId) {", + " $Ident = IPS_GetObject($VarId)['ObjectIdent'];", + " if (stripos($Ident, 'JobState') === 0) {", + " $Form['options'][] = [", + " 'caption' => IPS_GetName($VarId),", + " 'value' => $Ident", + " ];", + " }", + "}", + "usort($Form['options'], function($a,$b){", + " return strtolower($a['caption'])>strtolower($b['caption']);", + "});", + "$Form = [$Form];", + "$Form[]=['type' => 'CheckBox', 'name' => 'ACTIVE', 'caption' => 'Recording active?'];", + "return $Form;" + ], + "action": "ONVIF_SetRecordingJobMode($_IPS['TARGET'],$_IPS['IDENT'],$_IPS['ACTIVE']);", + "category": "target", + "restrictions": { + "objectType": [ + 1 + ], + "hasActionStatusVariables": true, + "moduleID": [ + "{24EE27C1-F77B-4EEE-9C9E-C53C674EFF47}" + ], + "includeEnvironments": [ + "TestCommands", + "Default" + ] + }, + "locale": { + "de": { + "Start or stop recording": "Starten oder Stoppen einer Aufzeichnung", + "Recording job": "Aufzeichnungs Job", + "Recording active?": "Aufzeichnung aktiv?", + "Control recording": "Steuerung von Aufnahmen", + "Set {TARGET, object, ident IDENT} to {ACTIVE, select, true {active} false {inactive}}": "Setze {TARGET, object, ident IDENT} auf {ACTIVE, select, true {aktiv} false {inaktiv}}" + } + }, + "description": "Control recording", + "format": "Set {TARGET, object, ident IDENT} to {ACTIVE, select, true {active} false {inactive}}" +} \ No newline at end of file diff --git a/imgs/Module.png b/imgs/Module.png index ed585d13c656d128be421e07d194b3b58dfb0871..f41ce6ca99e235a192f9a82568be34b1b9fbcb48 100644 GIT binary patch literal 26173 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 HJ-_=ev2HHx literal 47394 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 $Char) { + /** @var int $Bit */ if ($this->HasProfile($Bit)) { $Profiles[] = $Char; } @@ -321,12 +322,11 @@ class Timer } } -namespace ONVIF\Replay +namespace ONVIF\Recording { class Property { - public const VideoSource = 'VideoSource'; - public const RecordingToken = 'RecordingToken'; + public const EmulateStatus = 'EmulateStatus'; } }