Website-Icon Dein Smart Home Blog

So bindest du das Kamerabild der netatmo welcome in das Fibaro Home Center ein

Wir haben uns mal wieder ausführlich mit der API von netatmo beschäftigt. Dabei haben wir herausgefunden, wie das Kamerabild von der netatmo welcome im Fibaro HomeCenter angezeigt werden kann.

Vor etwa einem Jahr haben wir euch gezeigt, wie Ihr die Daten der Gesichtserkennung der welcome Kamera in eurem Fibaro HomeCenter 2 nutzen könnt. Den Artikel zu dem Thema findet Ihr hier. Jetzt haben wir uns, wie bereits erwähnt, mit der Einbindung des Kamerabildes von der welcome befasst.

Die netatmo welcome Kamera kann derzeit zum Beispiel für 169,00 € über Amazon.de käuflich erworben werden.

Ermittlung der netatmo welcome URL

Um sich den Stream im HomeCenter anzeigen zu lassen, muss der jpg-Stream der Kamera ermittelt werden. Manuell ist dieser Vorgang allerdings recht kompliziert, weshalb wir euch eine kleine Szene programmiert haben, die dies automatisch mit der netatmo API durchführt.

Diesmal haben wir uns auch die Mühe gemacht und in der Szene die Debug-Ausgaben in deutscher und in englischer Ausgabe eingefügt. Dazu könnt Ihr in der Zeile 12 die Sprache über die lokale Variable "language" (Werte: german/english) festlegen. Standardmäßig ist hier Deutsch voreingestellt.

local language = 'german' -- german/english

Um die Szene auszuführen, legt Ihr euch einfach eine neue LUA-Szene an und kopiert den Code auf euer HC2. Ihr müsst dann nur eure Daten (Client ID, Client Secret, Username & Passwort) für die Anbindung an die netatmo API anpassen. Den gesamten Code findet Ihr hier:

--[[
%% properties
%% globals
--]]

-- DIESE DATEN ANPASSEN
local client_id = '563a7XXX69f74027aXXXX'
local client_secret = 'OmHqQ551M6WXXXbTgGMWNYfiT1lZxHXXXXX'
local username = 'boomx@siio.de'
local password = 'XXX'

local language = 'german' -- german/english

-- AB HIER NICHTS MEHR ANPASSEN
local token = ''
local request_body = ''

Debug = function ( color, message )
  if (debug == 1) then
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
  elseif (debug == 0) then
  end
end

DebugChange = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

DebugError = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

fibaro:debug('netatmo welcome cam finder v1.0b')

if (language == 'german' or language == 'english') then
  DebugError( "green", "Debug: " ..language)
else
  DebugError( "red", "Please choose a language for debug")
  fibaro:abort();
end

local sourceTrigger = fibaro:getSourceTrigger();

function oAuth(nextFunction)
 local request_body = 'grant_type=password&client_id=' .. client_id .. '&client_secret=' .. client_secret .. '&username=' .. username .. '&password=' .. password .. '&scope=read_camera access_camera'
 getResponseData('https://api.netatmo.net/oauth2/token', request_body, 
     function(data)
      if (data.access_token ~= nil) then
        token = data.access_token
      	gethomedata()
      else
        if (language == 'german') then
          DebugError( "red", "oAuth-API-Call konnte nicht durchgeführt werden! oAuth 2.0 lieferte keinen Wert zurück")
        elseif (language == 'english') then
          DebugError( "red", "oAuth-API-Call Error. oAuth 2.0 returns nothing.")
        end
      end
    end
    )
end

function getResponseData(url, body, func)
 local http = net.HTTPClient()
 http:request(url, { 
 options = { 
 method = 'POST', 
         headers = {
 ['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
 },
 data = body
 },
 success = function(response) 
 func(json.decode(response.data))
 end
 })   
end

function gethomedata()
   request_body_cam = 'access_token=' ..token.. ''
   getResponseData('https://api.netatmo.net/api/gethomedata', request_body_cam, 
      function(getData)
      --fibaro:debug(request_body_cam)
      if (getData.body ~= nil) then
        if (language == 'german') then
          DebugError( "green", "API-Call durchgeführt.")
        elseif (language == 'english') then
          DebugError( "green", "API-Call was done.")
        end
        for w, v in pairs(getData.body.homes) do
          for a, b in pairs(v.cameras) do
            if (b.is_local) then
             if (language == 'german') then
                DebugError( "green", "Lokale IP der Kamera gefunden.")
             elseif (language == 'english') then
                DebugError( "green", "Local IP of cam was found.")
             end
             findLocalWelcome(b.vpn_url)
            else
             if (language == 'german') then
                DebugError( "green", "Lokale IP der Kamera NICHT gefunden.")
             elseif (language == 'english') then
                DebugError( "green", "Local cam NOT found.")
             end
            end
          end
        end
      else 
        if (language == 'german') then
          DebugError( "red", "API-Call fehlgeschlagen")
        elseif (language == 'english') then
          DebugError( "red", "API-Call Error")
        end
      end
 end
 )
end

function findLocalWelcome(url)
local selfhttp = net.HTTPClient({timeout=2000})
url = url..'/command/ping'
selfhttp:request(url, {
    options={
      headers = selfhttp.controlHeaders,
      method = 'GET',
      timeout = 5000
    },
    success = function(status)
      if status.status == 200 then
        if status.data ~= nil then
         --print(json.decode(status.data))
         for k,v in pairs(json.decode(status.data)) do 
          if (k == 'local_url') then
            local cam_url = v
            local url_new = string.sub(cam_url, 8, #cam_url)
            one, two = url_new:match("([^,]+)/([^,]+)")
            fibaro:debug('Cam-IP: '..one)
            fibaro:debug('JPG-Stream: /'..two.. '/live/snapshot_720.jpg')
            DebugError( "green", "coded 4 siio.de/siio.com")
          end
         end
        end
      else
        print ("failed")
        print(status.data)
      end
    end,
    error = function(error)
      print "ERROR"
      print(error)
    end
})

end

oAuth()

Die Szene startet nur bei manueller Ausführung und muss auch nur einmalig gestartet werden. Es wird damit nur der benötigte Pfad für die Kamera-Einstellung ermittelt. Dies funktioniert leider nur über die API von netatmo, eine Ermittlung der URL über den lokalen Zugriff ist nicht möglich.

Alle angezeigten Streams werden aber dann direkt über das lokale WLAN über die netatmo welcome abgerufen.

Die IP und der JPG-Stream wurden automatisch ermittelt / Debug in Englisch

Um den Stream jetzt im HomeCenter anzeigen zu lassen, müsst Ihr eine neue Kamera hinzufügen und dort die Werte (IP, JPG path, MJPG stream path) aus dem Debug-Fenster eintragen. Der JPG- und der MJPG-Stream müssen jeweils mit der gleichen URL ausgefüllt werden. Nach dem Speichern sollte dann das Bild angezeigt werden.

Kamera-Einstellung mit den ermittelteten Links

Die Kamera könnte natürlich auch im Fibaro HomeCenter Light eingebunden werden. Hier müsste allerdings die Ermittlung der benötigten URL händisch durchgeführt werden. Die Infos dazu erhaltet Ihr in der API von netatmo.

Sofern demnächst die netatmo presence verfügbar ist, werden wir das Skript natürlich auch mit dieser Kamera testen. Sollte dies genauso seitens netatmo umgesetzt sein, dann sollte das auch mit der presence Kamera funktionieren.

Viel Spass beim Umsetzen :)

Die mobile Version verlassen