[Modul] ONVIF Profil-S und T für IP-Kameras und Encoder

Ja, und wenn ich „Im Browser öffnen“ wähle, funktioniert es.

Was nix mit Onvif zu tun hat. Das ist nur um von der Konsole mal eben das Webinterface der Kamera zu öffnen.
Schalten WS-Security ein.
Michael

Es geht :slight_smile: VIELEN DANK

Ich habe eine reolink Kamera RLC1240A.
Im ONVIF Manager sehe ich folgende events
tns1:RuleEngine/CellMotionDetector/Motion
tns1:RuleEngine/MyRuleDetector/FaceDetect
tns1:RuleEngine/MyRuleDetector/PeopleDetect
tns1:RuleEngine/MyRuleDetector/VehicleDetect
tns1:RuleEngine/MyRuleDetector/DogCatDetect
Im Symcon Modul kann ich nur auf Motion reagieren, aber leider nicht auf PeopleDetect und VehicleDetect
Auch wenn ich eine ONVIF-Event Instanz anlege, kann ich diese Topics nicht ansprechen.

Siehe hier:

Oder hier:

Ist das Gerät hier vorhanden? Steht im DoC Analytics als unterstützt?
https://www.onvif.org/conformant-products/

Sonst; quasi wie immer, einmal einen Screenshot der IO Instanz mit den Gerätefähigkeiten und
einmal bitte ein Debug von IO (Limit abschalten) bei Fähigkeiten neu laden bereitstellen.

Dann kann ich zumindest mal schauen ob die Events überhaupt von der Kamera gemeldet werden.
Michael

Das jetzt Reolink ihre Firmware plötzlich streng nach ONVIF-Vorgaben programmiert würde mich erstaunen…
Reolink unterstütz aber mit der neusten Firmware Webhhooks.
Du kannst somit die Intelligente Erkennung (Tiere, Fahrzeuge, Personen) an einen Webhook senden. Erstelle also in Symcon einen Webhhook, hinterlege das unten stehendes Script und ab dann hast du diese Ereignisse der intelligenten Erkennung unterhalb des Scripts gelistet. Danach kannst du diese via Ablaufplan weiterverarbeiten, zB einen Schnappschuss erstellen etc…

<?php
// Hilfsfunktion zum Erstellen einer Variable, falls sie nicht existiert
function createVariableIfNotExists($parentID, $name, $type) {
    $variableID = @IPS_GetObjectIDByIdent($name, $parentID);
    if ($variableID === false) {
        $variableID = IPS_CreateVariable($type);
        IPS_SetName($variableID, $name);
        IPS_SetIdent($variableID, $name);
        IPS_SetParent($variableID, $parentID);
    }
    return $variableID;
}

// Hilfsfunktion zum Setzen einer Variablen basierend auf ihrem Typ
function setVariable($parentID, $key, $value) {
    if (is_string($value)) {
        $varID = createVariableIfNotExists($parentID, $key, 3); // String
        SetValue($varID, $value);
    } elseif (is_int($value)) {
        $varID = createVariableIfNotExists($parentID, $key, 1); // Integer
        SetValue($varID, $value);
    } elseif (is_float($value)) {
        $varID = createVariableIfNotExists($parentID, $key, 2); // Float
        SetValue($varID, $value);
    } elseif (is_bool($value)) {
        $varID = createVariableIfNotExists($parentID, $key, 0); // Boolean
        SetValue($varID, $value);
    } elseif (is_array($value) || is_object($value)) {
        $varID = createVariableIfNotExists($parentID, $key, 3); // String für JSON-String
        SetValue($varID, json_encode($value));
    } else {
        // Unbekannter Typ, als String speichern
        $varID = createVariableIfNotExists($parentID, $key, 3);
        SetValue($varID, (string)$value);
    }
}

// ID des aktuellen Skripts
$scriptID = $_IPS['SELF'];

// Erstellen oder Abrufen einer Kategorie unterhalb des Skripts
$categoryID = @IPS_GetObjectIDByIdent('WebhookData', $scriptID);
if ($categoryID === false) {
    $categoryID = IPS_CreateCategory(); // Kategorie erstellen
    IPS_SetName($categoryID, "Webhook Data");
    IPS_SetIdent($categoryID, 'WebhookData');
    IPS_SetParent($categoryID, $scriptID);
}

// Erfassen der rohen Daten
$rawData = file_get_contents("php://input");

if (!empty($rawData)) {
    $data = json_decode($rawData, true);

    if (is_array($data)) {
        foreach ($data as $key => $value) {
            // Wenn der Wert selbst ein Array oder Objekt ist, weiter rekursiv durchlaufen
            if (is_array($value) || is_object($value)) {
                foreach ($value as $subKey => $subValue) {
                    if ($subKey === 'alarmTime') {
                        // Zeitstempel in richtige Zeitzone konvertieren und speichern
                        $dateTime = new DateTime($subValue);
                        $dateTime->setTimezone(new DateTimeZone('Europe/Berlin')); // Beispiel: Zeitzone auf Europa/Berlin setzen
                        $formattedAlarmTime = $dateTime->format('Y-m-d H:i:s');
                        setVariable($categoryID, $subKey, $formattedAlarmTime);
                    } else {
                        setVariable($categoryID, $subKey, $subValue);
                    }
                }
            } else {
                setVariable($categoryID, $key, $value);
            }
        }

        // Beispielhafte Protokollierung der Daten
        //IPS_LogMessage("Reolink-Carport", "Empfangene Daten: " . print_r($data, true));
    }
} else {
    IPS_LogMessage("WebHook RAW", "Keine rohen Daten empfangen oder roher Datenstrom ist leer.");
}

echo "Message: " . (isset($_GET['Message']) ? $_GET['Message'] : "Keine Nachricht");

Hi,

ich wollte das Modul mal wieder nutzen, wenn ich aber versuche eine Instanz einer der gefunden Kameras zu erstellen kommt immer nur:

Konnte Instanz nicht erstellen
TypeError: Cannot set properties of null (setting ‚instanceID‘)

Jemand ne Idee?

Grüße und frohes neues Jahr

Habe mal versucht das IO von Hand anzulegen, werde dann gleich mit dieser Meldung verwirrt:

Fehler beim Übernehmen der Änderungen

Warning: DOMDocument::loadXML(): Namespace prefix tad on Capabilities is not defined in Entity, line: 2 in /mnt/data/symcon/modules/.store/de.nall.chan.onvif/ONVIF IO/module.php on line 1777
(Code: -32603)

:thinking:

Versuche bitte die Beta vom Modul.
Vermutlich wird sich aber nur die Fehlermeldung ändern, da dein Gerät wohl ein ungültiges XML sendet.

Michael

Hallo Zusammen,

ich stehe gerade etwas auf dem Schlauch. Ich nutze das Onvif Modul, Stream(s) und Bewegungserkennung funktionieren(Win11, IPS 8), Snapshot legt jedoch eine leere jpg (1k) an.

2 Frage, ich möchte gerne über IPS die Aufzeichnung der Kamera steuern und habe auch schon im Forum gestöbert, aber noch keine wirkliche Lösung gefunden. Es sollte eigentlich über einen API Aufruf gehen oder gibt das Modul das schon her? Es geht mir nur um das ein und ausschalten des Recordings.

Viele Grüße

Lothar

Bitte fragen zum Modul hier stellen, sonst übersehe ich das eventuell.
Erstelle mal ein Debug der Snapshot Instanz und sende es mir per PN, dann kann ich schauen warum das Bild defekt ist.
Aufzeichnung ein/ausschalten ist mit der aktuellen Beta möglich.

Michael

Hallo Michael,

nochmal danke für die schelle Antwort. Dump gesendet. Beta installiert, aber nicht kapiert. was muss als Ereignis eingetragen werden? In der Doku habe ich nichts gefunden.

Viele Grüße

Lothar

Eigentlich nix, das sollte, wenn über den Konfigurator angelegt, automatisch passieren.
Kann dein Gerät überhaupt Profil G?
Schau mal was die Geräte Infos im Onvif IO dazu sagen.
Michael

Danke!

Ich konnte das Snapshot Problem lösen, in dem ich auf der Kamera weitere Protokolle freigegeben habe. Einzig das Recording Thema ist jetzt noch offen. Es kann gut sein das die Kamera das G Profil nicht unterstützt. Allerdings sollte es möglich sein das Recording über einen separaten Request zu steuern.
vg Lothar

Guten Morgen,

kann man die IO Instanz auch über ein Skript wieder aktivieren ?

Mit IPS_SetProperty(12345,„Open“,„0“); kann sie deaktiviert werden.
Nur zum Aktivieren habe ich noch nichts gefunden.

Ich wollte die IO Instanz über ein Skript deaktivieren, wenn die Kamera ausgeschaltet ist.
Im Log sind sonst immer viele Meldungen, dass die Kamera nicht erreicht werden kann.

Mit freundlichen Grüßen

Statt „0“ wäre false korrekt um den IO zu schließen und true um ihn zu öffnen.
Michael

1 „Gefällt mir“

Danke, das hat funktioniert.

Ich hatte es auch schon mal mit true versucht, aber da hatte ich „true“ statt nur true und das klappte nicht.

Mit freundlichen Grüßen

Das wäre ja ein String und ebenso falsch wie „0“.
Die Dokumentation listet die korrekten Datentypen auf: Konfiguration

Michael

Hallo Michael,
neben mehrere onvif-kompatiblen Kameras habe ich auch einige, die ich mit dem Image Grabber vom IPS auslesen muss. Im weiteren Verlauf meiner Visualisierung benutze ich IPSVIEW mit den persönlichen Elementen, die explizit auf die IDENTS ausgerichtet sind. Leider erzeugt der Image Grabber beim Standbild den Ident „Image“, während dein Modul den Ident „IMAGE“ verwendet. Ich habe das einfach im Modul angepasst, aber schön ist das natürlich nicht - spätestens mit der neuen Version. Hat das einen bestimmten Grund, warum du eine andere Schreibweise benutzt hast ?

Grüße Frank

Ja, dann musst du halt eins für den Image grabber und eins für Onvif bauen.
Idents liegen halt in der Hoheit der Module.
Michael