Website-Icon Dein Smart Home Blog

So bindest du das Kamerabild der netatmo presence in das Fibaro HomeCenter ein

Das Kamerabild der netatmo welcome haben wir ja bereits in das Fibaro HomeCenter 2 eingebunden. An dieser Stelle hat allerdings noch die netatmo presence gefehlt. Mit diesem Artikel liefern wir euch auch diese Integration, wie das genau funktioniert erfahrt hier in diesem Artikel.

In den Kommentaren zu dem oben erwähnten Artikel zu der netatmo welcome Integration in das Fibaro HomeCenter 2 sind wir bereits kurz darauf eingegangen, dass das vorgestellte Skript nicht mehr der API, also der Programmierschnittstelle, von der netatmo presence kompatibel ist. Wir haben den LUA-Code mal angepasst, dass dieser auch kompatibel mit der netatmo presence ist. Mit diesem Code könnt Ihr den lokalen JPG-Stream der Kamera ermitteln, damit dieser dann als Stream im Fibaro HomeCenter 2 angezeigt werden kann.

Die netatmo presence Outdoor-Kamera kann derzeit zum Beispiel für 279,00 € über Amazon.de käuflich erworben werden.

Stream in der Nacht

Ermittlung der netatmo presence URL

Wie auch bei der welcome-Kamera muss die lokale Stream-URL ermittelt werden. Bei der presence-Kamera sind allerdings andere Berechtigungen bei der API notwendig, weshalb das alte Skript an dieser Stelle nicht funktioniert. Dies haben wir jetzt nachgeholt und Ihr könnt das Skript mit der netatmo presence nutzen.

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 = '563a791369f740xxx'
local client_secret = 'OmHqQ551M6xxx'
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 presence cam finder v1.5')

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_presence access_presence'
 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.

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-Einstellungen im Fibaro HomeCenter 2

Anders als bei der welcome können andere Funktionen der presence nicht mit dem Fibaro HomeCenter 2 nicht genutzt werden.

Die mobile Version verlassen