[Modul] Netatmo Camera (Presence / Welcome)

Hallo zusammen,

habt ihr evtl. Probleme bei der Verbindung nach dem Update der Presence cam?
Folgendes:
Cam wurde nicht mehr verbunden, ich musste im Router einen Port für ein Update freischalten.
Danach bekomm ich von IPS zwar den connect, aber kann nicht mehr auf den Livestream der cam zugreifen.

Sieht jetzt so aus, als ob die Welcome den gleichen weg einschlägt.

Gruß oekomat

PS: wie kann ich die funktionen nutzen? per Skript bekomm ich keine Ausgabe, wenn ich sie in eine Variable schreiben lasse.

hallo,

ich habe kein Problem (Presence), Firmware ist aber (noch?) die 194.

demel

Presense hab ich 184 und Welcome 456.

Irgendwas muss aber netatmo doch angepasst haben. bis heute mittags lief alles.

Jedenfalls hab ich nochmal in deiner Doku geschaut und die Verbindung IPS zu netatmo wird im Broser auch als successful bestätigt. wie kann ich aber das Livebild wiedergeben? Vorher hatte ich eine URL mit Token.

Hallo,
ich bin etwas verwirrt, was meinst du mit URL mit Token? Der Zugriff auf Live- und Archiv-Bilder geht in dem Modul über ein WebHook und die entsprechenden Scripte (siehe docs im github) aber das ist kein Token enthalten.
Natürlich ist die Kommunikation zu Netatmo und der Kamera eine REST-API, also kommen dar URl’s vor, aber die Token ändern sich laufen und die URl’s zur Kamera gehen über sich ändernde VPN-Serverver von Netatmo …

Was missverstehe ich?

gruß
demel

Ok, meinen Fehler erkannt. Ich hatte dein Modul zwar installiert, aber ein alten Weg mit einem alten anderen Modul mit der client ID und dem client secret von netatmo genutzt. Also alles auf Anfang.

Modul läuft, Verbindung zu netatmo steht. In der Netatmo Web Anmeldung dev.netatmo.com hab ich die o.g. client ID und client secret. Verstehe ich so, dass client secret der Webhook ist? Dann bin ich so vorgegangen:

  • string Variable als html Box erstellt mit Daten aus der doc:
    - IPS url
    - webhook

  • in der Instanz der Camera den Webhook eingetragen /hook/<Webhook>

  • skript anlegen mit den Daten aus der doc
    - instance ID = Instand der Kamera
    - _server = IP von Symcon

Da muss doch noch mehr angepasst werden oder? Aber woher die Daten?

Gruß oekomat

noch kann ich nicht ganz folgen

der Client-Secret dient nur zur Identifizierung (wenn man nicht OAuth macht, mit OAuth gubt es weder Client-ID noch - Secret)

da gibt es eine Reihe von Scripten und einige Hinweise in der doc; sogar zwei WebHooks. Welchen Punkt meinst du genau? Wer Webhook alleine reicht ja nicht aus, der kann ja viele Aufgaben wahrnehmen.

eine genauere Anleitung für das Verfahren findest du in dem essentiellen Script docs/processStreamURL.php, da steht, was in der HTmL-Box eingetragen werden muss, das Script muss natürlich in der Konfiguration der Kamera-Instanz eingetragen werden.

da kann ich Dir gar nicht mehr folgen, wo bist du da?

demel

ok, dann nochmal weiter zurück.

NetatmoSecurityIO
In IP-Symcon nun unterhalb von I/O Instanzen die Funktion Instanz hinzufügen (CTRL+1) auswählen, als Hersteller Netatmo und als Gerät NetatmoSecurity I/O auswählen.

hab ich

[b]In dem Konfigurationsformular nun den gewünschten Zugang wählen, entweder als Nutzer über IP-Symcon Connect oder als Entwickler mit eigenem Entwicklerschlüssel.

Zugriff mit Netatmo-Benutzerdaten über IP-Symcon Connect

Hierzu bei Netatmo anmelden auswählen. Es öffnet sich ein Browserfenster mit der Anmeldeseite von Netatmo; hier bitte anmelden. Dann erscheint ein weiteres Fenster[/b]

Zeigt mir auch „netatmo succesfully connected“

Dann instanz der Camera angelegt:

Dann Variable mit iFrame Inhalt angelegt inkl der Symcon IP


<iframe width=„100%“ height=„360“ src=„http://192.168.10.21:3777/hook..../video?live&result=custom“></iframe>
Was kommt dann bei … rein?

Folgenden Skript angelegt:

<?php

declare(strict_types=1);

// Author:    Christopher Wansing
// Created:   13.07.19
// Modified:  21.07.19
//
// Hinweise:
// - Variable:           Create variable of datatype "String" with profile "~HTML-Box"
//   ... with Content:   <iframe width="100%" height="360" src="<IPS-URL>/hook/<HookName>/video?live&result=custom"></iframe>
//                       - <IPS-URL> may be "https://<ipmagic-Adresse>" (preffered) or "http://<IPS-IP>:3777"
//                       - <HookName> ist the name of the Hook (from Configuration of the Instance)
//                       - Instead of "video/live", the command can also be "snapshot/live" etc (see README.md)
//
// - Player Height:      Add '&height=xxx' to the URL in the iframe. Also change the iframe height accordingly (Player height + 20)
//                       no given or empty 'height' meens 'auto'
// - Player Width:       Add '&width=xxx' to the URL in the iframe. Also change the iframe width accordingly (Player width + 20)
//                       no given or empty 'width' meens 'auto'
// - Poster RefreshRate: Add '&refreshRate=xxx' to the URL. Sets the time for when a new Preview JPG should be fetched in seconds
// - AutoPlay:           Add '&autoplay' to the URL in the iframe

$scriptName = IPS_GetName($_IPS['SELF']) . '(' . $_IPS['SELF'] . ')';
$instName = IPS_GetName(57336);

// IPS_LogMessage($scriptName, '_IPS=' . print_r($_IPS, true));

// _SERVER-Variablen bereitstellen
$SERVER = json_decode("https://192.168.10.21:3777", true);
// IPS_LogMessage($scriptName, 'SERVER=' . print_r($SERVER, true));

// _GET-Variablen bereitstellen
$GET = json_decode(_IPS['_GET'], true);
// IPS_LogMessage($scriptName, 'GET=' . print_r($GET, true));

// URL's ausleѕen
$url = (string) $_IPS['url'];
$posterURL = isset($_IPS['alternate_url']) ? $_IPS['alternate_url'] : '';

// URL-GET-Parameter parsen
$height = isset($GET['height']) ? $GET['height'] : '340';
$width = isset($GET['width']) ? $GET['width'] : '';
$autoplay = isset($GET['autoplay']) ? true : false;
$refreshRate = isset($GET['refreshRate']) ? $GET['refreshRate'] : '300';

// IPS_LogMessage($scriptName, 'inst=' . $instName . ', height=' . $height . ', width=' . $width . ', autoplay=' . $autoplay . ', refreshRate=' . $refreshRate);

$video_id = 'NetatmoStream_' . substr(uniqid(), -4);

$html = '';

if (preg_match('/\.m3u8$/', $url)) {
    $html = '<link href="https://vjs.zencdn.net/7.6.0/video-js.css" rel="stylesheet">';
    $html .= '<video id="' . $video_id . '" class="video-js vjs-default-skin vjs-big-play-centered" ';
    if ($height != '') {
        $html .= 'height="' . $height . '" ';
    }
    if ($width != '') {
        $html .= 'width="' . $width . '" ';
    }
    $html .= 'controls ';
    if ($autoplay) {
        $html .= 'autoplay ';
    }
    if ($posterURL != '') {
        $html .= 'poster="' . $posterURL . '" ';
    }
    $html .= '>  ';
    $html .= '  <source type="application/x-mpegURL" src="' . $url . '">  ';
    $html .= '</video>    ';

    $html .= '<script src="https://vjs.zencdn.net/7.6.0/video.js"></script>    ';

    $html .= '<script>  ';
    if ($posterURL != '') {
        $html .= 'function refreshPoster() {  ';
        $html .= 'player.poster("' . $posterURL . '?" + new Date().getTime());  ';
        $html .= '}  ';
    }
    $html .= 'var player = videojs("' . $video_id . '");  ';
    if ($posterURL != '' && $refreshRate > 0) {
        $html .= 'player.setInterval(refreshPoster, ' . ($refreshRate * 1000) . ');  ';
    }
    $html .= '</script>';
} elseif (preg_match('/\.jpg$/', $url)) {
    $html = '<img src="' . $url . '" ';
    if ($height != '') {
        $html .= 'height="' . $height . '" ';
    }
    if ($width != '') {
        $html .= 'width="' . $width . '" ';
    }
    $html .= '>';
} elseif (preg_match('/\.mp4$/', $url)) {
    if (preg_match('/firefox/i', $SERVER['HTTP_USER_AGENT']) || preg_match('/[5-9]\.[2-9]/', IPS_GetKernelVersion())) {
        $html = '<video ';
        if ($height != '') {
            $html .= 'height="' . $height . '" ';
        }
        if ($width != '') {
            $html .= 'width="' . $width . '" ';
        }
        $html .= 'controls ';
        if ($autoplay) {
            $html .= 'autoplay ';
        }
        $html .= '>  ';
        $html .= '<source src="' . $url . '" type="video/mp4">  ';
        $html .= '</video>';
    } else {
        $html = 'MP4 kann nur mit Firefox abgespielt werden, solange noch nicht mindestens IPS 5.2 installiert ist.';
    }
}

$html = preg_replace('/[ ]{2}/', "
", $html);   // Ersetzt doppelte Leerzeichen durch Zeilenumbrüche

// IPS_LogMessage($scriptName, 'inst=' . $instName . ', html=' . $html);
echo $html;     // Ausgabe zurück an das aufrufende Modul

$instName ist die Instanz meiner Camera

Da fehlt jedoch noch die Variable $Get. Was gibt diese aus?

Sorry, aber bei der Doku blick ich irgendwie nicht ganz durch. Und danke vorab für deine Geduld.

Hmm, warum ersetzt Du in dem Script

$instName = IPS_GetName($_IPS['InstanceID']);

durch

$instName = IPS_GetName(57336);

ersetzt? Die Instanz-ID steckt durch in $_IPS[‚InstanceID‘]

$_IPS ist doch ein Array von Standardvariablen (Systemvariablen — IP-Symcon :: Automatisierungssoftware) ebenso wie _GET (diese wird bei derm Aufruf eines WebHook mit den Aufrundeten gefüllt).

Nein, an dem Script musst Du nichts ändern.

Du must nur die HTML-Box gemäß der Angabe im Script anlegen

// - Variable:           Create variable of datatype "String" with profile "~HTML-Box"
//   ... with Content:   <iframe width="100%" height="360" src="<IPS-URL>/hook/<HookName>/video?live&result=custom"></iframe>
//                       - <IPS-URL> may be "https://<ipmagic-Adresse>" (preffered) or "http://<IPS-IP>:3777"
//                       - <HookName> ist the name of the Hook (from Configuration of the Instance)

als <HookName> nimmst Du wie beschrieben den Name, den du in der Instanz angegeben musst (aber lt. Screenshot nicht angegeben hast), als zB „Kamera“.

Das o.g. Script muss darunter eingetragen werden

Und dann wird in der HTML-Box der der live-stream angezeigt.

gruß
demel

ok…hab den Skript wieder zu original umgestellt und bekomme bei Ausführung Fehlermeldungen:

beim Webhook hab ich einfach „Carport“ geschrieben und in die String-Variable (HTML-Box) auch eingesetzt.

Das Bild kommt allerdings nicht und bleibt schwarz.

warum rufst du das script denn auf?
das script wird aufgerufen, wenn auf den webhook zugegriffen wird.
und das passiert, wenn du die HTML-Box anzeigst. da steht ja die url des webhook drin.

demel

Na gut, aber Box bleibt leer, bzw. Bild schwarz. Habs in IPS View versucht. IPS Version 5.4

was passiert denn, wenn du die Url, die du in der HTML-Box eingetragen hast, in einem Browser aufrufst?

hast du mal geschaut, ob der WebHook in Kern -Webhook richtug eingetragen ist? Das macht die Instanz, wenn du eventuelle änderungen in der Kamera-Instanz speicherst.

demel

die Seite bleibt weiß, wenn ich „http://192.168.10.21:3777/hook/Carport/video?live&result=custom&autoplay“ eintrage, egal ob Chrome oder edge.

In der Kern-Hook hat die Camera /hook/Carport angelegt, so wie es in der Kamera instanz auch steht.

ok, dann bräuchte ich ein debug sowohl von der Kamera- als auch IO-Instanz während des Abrufts via Browser.

schicks mir an demel42@web.de. vielleicht sehe ich was. die debug Limitierung bitte höher stellen, der stamdard ist viel zu klein.

demel

Hallo Memel,

ich habe leider auch ein Problem mit der Kameraeinrichtung meiner Presence. Ich kann in Safari und in IPSView nicht den Inhalt der htmlBox Variable anzeigen. Dort erhalte ich ein „FilenotFound“ Fehler.

Wenn ich den Link den iFrame aufrufe erhalte ich das Bild:
http://192.168.yyy.xxx:3777/hook/KameraGarten/video?live&result=custom&autoplay

Leider finde ich aktuell den Fehler nicht. Vielleicht hast Du eine Idee was es sein könnte.

Danke und Gruß
Christian

Hallo zusammen.

Leider habe ich auch Probleme den Live Stream anzeigen zu lassen. Ich bekomme es weder im Webfront per Variable hin, noch der Aufruf direkt im Browser funktioniert.
Welche Daten muss ich noch liefern für eine Fehleranalyse.

Mfg Stefan

Hallo zusammen,

ich bekomme seit einigen Tagen immer einen 204 Fehler bei meinen Netatmo Presence Cams.
Hat jemand ggf. einen Tipp?

Hallo @demel42 ,

ich nutze dein Webhook für Notifications.
Einstieg ist:

$instID = $_IPS['InstanceID'];

dann ziehe ich mir die neue notification

$notifications = json_decode($_IPS['new_notifications'], true);

und um wirklich das neuste zu erhalten hole ich mir das letzte element, da ich davon ausgehe, dass new_notifications mehrere beinhalten kann.

$notification = end($notifications);

daraus ziehe ich mir sämtliche relevante werte um die snapshot URL zu erhalten:

if (isset($notification['event_type'])) {
    $event_type = $notification['event_type'];
    $subevent_id = $notification['subevent_id'];
    SetValueString($Camera_ID, IPS_GetName($instID));
    SetValueString($Event_Type_ID, $event_type);  
    $snapshotUrl = NetatmoSecurity_GetSnapshotUrl4Subevent($instID, $subevent_id, true);

Leider ist die snapshotUrl jedoch immer false. Wenn ich mit der subevent_id jedoch die Methode aufrufe ist alles in Ordnung.
Muss ich den String von $subevent_id ggf. escapen o.ä.? oder liegt hier ein Threading Problem vor, dass das subevent noch gar nicht verfügbar ist?

Scheinbar ist es tatsächlich so, dass ich zu früh versuche die URL zu genieren.
Da ich das Bild gerne per Push sofort verschicken möchte, wäre es möglich, dass Du weitere Felder des Requests von Netatmo durchreichst? Konkret z.B. snapshot_url? Gerne auch den ganzen Response.

Ist nicht ganz so einfach zu beantworten und da ich das auch nicht mehr so im Kopf habe, kann ich auch gar nicht sagen, ob es funktioniert :slight_smile:

also habe ich versucht so einen Aufruf zu tätigen (also in einem Script)
Bei mir hat dieser Aufruf eine URL zurück geliefert, funktioniert also immer noch.
die URL war keine lokale URL sondern so https://api.netatmo.com/api/getcamerapicture?image_id=

Was kann da schief gehen…
Es könnte es, das der Event noch nicht gespeichert ist. Die Daten liegen ja im media-Verzeichnis unter <InstID der Kamera>-Events.dat
Das könntest Du überprüfen, indem du die in Subevent-ID ausgeben lässt (bzw in der o.g. Datei nachschaust) und den NetatmoSecurity_GetSnapshotUrl4Subevent()-Call in einem Script ausführst.
Das ist eigentlich das einzige, was da passieren kann.

Da die Notifications ja via WebHook bei Feststellung des Ereignissen vom Netatmo geschickt werden kommen sie zeitnah, die Events (wo dann die Zugriffsdaten u.a. auf die Bilder geliefert werden), werden vom Modul zyklisch abgerufen.

Von daher stehen die Daten zu dem Zeitpunkt noch gar nicht zur Verfügung.

Jein, die Daten ja, aber du musst dann die URL selbst aufbauen

$id = $notification['snapshot']['id'];
$key = notification['snapshot']['key'];
$url = NetatmoSecurity_GetPictureUrl(1234, $id, $key);

Da snapshot nicht immer da sein muss, bitte mit isset() prüfen.

Ich bin noch etwas dabei umzubauen (ich hatte was angefangen und kann daher nicht so einfach den Teil ergänzen), sollte aber vermutlich im Laufe des morgigen Tages als beta zur Verfügung stehen.

Super, danke für die schnelle Rückmeldung.
Das mit Snapshot prüfe ich mal. Ich hatte mich eh schon gewundert, warum ich den webhook immer 2x aufgerufen bekomme. Möglicherweise hängt dann bei einem der snapshot drin.

Aktuell habe ich mir eine Schleife gebaut, die halt 6x nach jeweils 1 Sekunde versucht die snapshot URL zu generieren. Irgendwo in Deiner Docu stand nämlich, dass du nach Webhook Call nach 5 Sekunden die Events schreibst…