[Modul] Netatmo Camera (Presence / Welcome)

Hallo,

hast du dir mal das im README genannte Script IPSymconNetatmoSecurity/processStreamURL.php at master · demel42/IPSymconNetatmoSecurity · GitHub angeschaut? Grundsätzlich geht das zB über den WebHook (den man in der Instanz-Konfiguration aktivieren kann, demmo.g. Script und einer Variable (siehe Script).

gruß
demel

Bekomme das Modul auch nicht mehr zum Laufen.
Hatte es testweise vor einigen Wochen installiert, lief eigentlich ganz gut nur das Bild wurde nicht angezeigt.
Da ich keine Zeit hatte musste es erst mal ruhen.
Nun wollte ich das Modul neu aufsetzen aber es geht nichts mehr.

Konnte Konfigurationsform nicht laden
<br />
<b>Notice</b>: Undefined index: name in <b>/var/lib/symcon/modules/.store/demel42.netatmo.security/NetatmoSecurityConfig/module.php</b> on line <b>104</b><br />
{„elements“:[{„type“:„Label“,„caption“:„category for products to be created:“},
{„name“:„ImportCategoryID“,„type“:„SelectCategory“,„caption“:„category“},{„type“:„Configurator“,„name“:„products“,„caption“:„Products“,„rowCount“:1,„add“:false,„delete“:false,„sort“:{„column“:„name“,„direction“:„ascending“},„columns“:[{„caption“:„Category“,„name“:„category“,„width“:„200px“},{„caption“:„Home“,„name“:„home“,„width“:„200px“},{„caption“:„Name“,„name“:„name“,„width“:„auto“},

Verbunden ist es über Symcon-Connect, das Netatmo Weather Modul funktioniert problemlos.
Umstellen auf Entwickler-Schlüssel hilft nicht.
Token habe ich schon x-Mal gelöscht.
Modul schon mehrfach neu installiert,…
App- und Web-Zugriff zu Netatmo Secure klappt ohne Probleme.

Was könnte das sein?
Wie bekomme ich es wieder hin?
Was kann ich zusätzlich an Infos liefern?

Hallo,

es scheint so, das in den Daten etwas fehlt.

Bitte folgendes machen:

  1. Debug in der NetatmoSecurityIO-Instanz aktivieren („Limitierung“ bitte unbedingt erweitern)
  2. dann die NetatmoSecurityConfig-Instanz öffnen -> es müsste dann ja der Fehler auftreten
    3 . wenn der Fehler auftritt, bitte in der IO-Instanz einmal auf „Daten aktualisieren“ drücken
  3. die Config-Instanz erneut öffnen

den Debug der IO-Instanz an mich mailen (demel42@web.de)

demel

Hallo,

ich habe auch seit dem WE eine Netatmo Presence installiert. Leider bekomme ich sie in IPS noch nicht ganz eingerichtet.
Ich habe die IO Instanz und den Konfigurator eingerichtet. Die Kamera als Instanz angelegt.
Die Variablen dort werden erzeugt und auch aktualisiert mit ausnähme der zusätzlichen Variablen

Ich habe in der Instanz der Kamera einen Webhook /hook/KameraGarten angelegt und das „ProcessStreamUrl“ Script da eingetragen.

Eine Variable vom Typ String angelegt mit folgendem Inhalt:

<iframe width="100%" height="360" src="http://192.168.xxx.xxx:3777/hook/KameraGarten/video?live&result=custom"></iframe>

Schaue ich mir diese Variable im Webfront an wird nichts angezeigt, egal ob unter Chrome oder Safari

Mit diesem Script

<? 
             
$instID = 42345 /* die Instanz der Kamera */; 

$vpn_url = NetatmoSecurity_GetVpnUrl($instID); 
echo 'vpn_url=' . $vpn_url . PHP_EOL; 

$local_url = NetatmoSecurity_GetLocalUrl($instID); 
echo 'local_url=' . $local_url . PHP_EOL; 

$live_video = NetatmoSecurity_GetLiveVideoUrl($instID, 'high', 1);
echo 'live_video=' . $live_video . PHP_EOL; 

$live_snapshot = NetatmoSecurity_GetLiveSnapshotUrl($instID, 'high'); 
echo 'live_snapshot=' . $live_snapshot . PHP_EOL;

habe ich mal versucht die URLs zu ermitteln. Aber die Rückmeldung ist in allen Fällen leer.

Habe ich etwas übersehen? Was kann ich noch prüfen?

Danke und Gruß
Christian

Hallo,

was meinst Du mit zusätzlichen Variablen?

Um das zu Debugger bräuchte ich ein paar mehr Informationen
a) die Einstellungen von der IO und Camera-Instanz
Auch eine Information, wie Du dich verbunden hast, über OAuth oder über eine einen APP-Einrichtung bei Netatmo?
b) die IP vom Symcon und von der Kamera bzw eine eindeutige Kennzeichnung, was es ist - bei der o.g. IP-Adresse (xxx.xxx) ist schwer zu entscheiden, ob es die IP von IPS ist
Gibt es einen Grund, warum du eine lokale Adresse verwendest, hast du ein Connect oder hat es einen anderen Grund?
c) ein Dump beider Instanzen wären eines zyklischen Abrufs.

Die Abfrage der Von bzw Local-URL ist schon erstmal die wichtigste Abfrage und wenn die nichts zurückliefert, funktioniert der Rest auch nicht.

Bitte den Dump der beiden Camera-Instanz, wenn Du ein Script mit den beiden Abrufen laufen lässt.

Bitte die Debug-Limitierung deutlich erhöhen, denn die vorgegebenen 1000 Zeilen sind typischerweise zu wenig.

Schick mit das an demel42@web.de und ich schaue mir das mal an.

Die Installation ist aus dem Modul-Store? Stable oder Beta?

Gruß
demel

Hallo, und danke für die super schnelle Rückmeldung.

Mit den zusätzlichen Variablen meine ich die vier, die man in der Kamera-Instanz unter „optionale Daten“ aktivieren kann.

zu a:
Ich habe mich mit OAuth verbunden, ist auch in der OAuth Instanz von IPS eingetragen.
In der IO Instanz habe ich sonst nicht eingetragen.
Hier die Kamera Instanz:

zu b:
Die IP Adresse ist die vom IPS Server lokal. Ich wollt e nur die Adresse im Forum nicht veröffentlichen.
die Connect Adresse habe ich nun auch eingetragen, das ändert aber nichts.

zu c:
Die Installation ist aus dem ModulStore stable.
Ich habe eben auch im Debug schon einen Hinweis gesehen

10.08.2020, 10:07:20 | do_HttpRequest | cdata={„error“:„invalid_request“,„error_description“:„Missing parameters, „username“ and „password“ are required“}

Nur wüsste ich nicht, wo ich diese Info mitgebe. In der I/O Konfiguriert habe ich keine Felder dafür.

Gruß
Christian

Ich hoffe die Frage passt hier in den Thread:
Gibt es die Möglichkeit, die Netatmo Cams auch über das neue RTSP/MJPEG Feature in Symcon 5.5 im Webfrontend zu integrieren?

Hallo,

Nein, das geht nicht, das Netatmo kein RTSP/MJPEG liefert, es kommt MP4 und ich kenne keine Möglichkeit, das irgendwie zu konvertieren.

Daher streame ich bei mir MP4 - funktioniert leidlich, da das auf dem iPad in der App immer wieder hängen bleibt (da ist noch ein offenes ToDo bei @paresy ;)), bei Aufruf des Safari auf iOS oder macOS funktioniert das einwandfrei.

demel

Was ist denn da der beste Weg für die Symcon 5.5 App?
Über eine HTMLBox habe es nicht hinbekommen - hier erfolgt nur eine Augabe des Strings als literal.

Hast Du das README und die im Github (IPSymconNetatmoSecurity/docs at master · demel42/IPSymconNetatmoSecurity · GitHub) befindlichen Vorlagen für die benötigten Script durchgearbeitet? In diese Thread habe ich das auch schon das ein oder andere mal begleitet …

Für die Anzeige des aktuellen Streams ist das im wesentlich der WebHook sowie ProcessStreamURL in der Device-Instanz. in ProcessStreamURL.php steht im Kopf, was noch weiter gemacht werden muss.

Wenn man eine Timeline sehen will oder von Ereignissen gestimmte Aktionen abhängig machen möchte, braucht man natürlich weitere Einstellungen und Scripte (buildTimeline.php, processNotification.php).

Will man das auch ausserhalb des eigenen WLAN’s sehen, muss man zum Netzwerk ein bisschen was angeben (damit er entscheiden kann, wann er zuhause ist und wann ausserhalb), um die richtige URL zu wählen.

Gruß
demel

Danke Dir. Das werde ich mir gleich im Detail ansehen.
Ich nutze ohnehin VPN und die Webhooks stehen bereits. :slight_smile:

Danke!!

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.