1. Giriş
Cihaz Erişimi programı, geliştiricilerin uygulamalarından Google Nest cihazlarını kontrol etmeleri için bir REST API olan Smart Device Management API'yi sağlar. Kullanıcıların, Nest cihazlarına üçüncü taraf erişimi için izin vermesi gerekir.

Başarılı bir Cihaz Erişimi entegrasyonu için üç temel adım vardır:
- Proje Oluşturma: Google Cloud Platform'da bir proje oluşturun ve Cihaz Erişim Konsolu'nda geliştirici olarak kaydolun.
- Hesap Bağlama: Hesap bağlama akışı aracılığıyla kullanıcıları elde edin ve erişim kodu alın. Kodu erişim jetonuyla değiştirin.
- Cihaz Kontrolü: Erişim jetonuyla komut göndererek cihazları kontrol etmek için Smart Device Management API istekleri gönderin.
Bu Codelab'de, kimlik doğrulama işlemini gerçekleştiren ve Smart Device Management API çağrıları yapan bir web uygulaması oluşturarak Cihaz Erişimi'nin nasıl çalıştığını ayrıntılı bir şekilde inceleyeceğiz. Ayrıca, Cihaz Erişimi isteklerini yönlendirmek için Node.js ve Express kullanarak basit bir proxy sunucusu dağıtmayı da ele alacağız.
Başlamadan önce, bu Codelab'de kullanacağımız yaygın web teknolojileri hakkında bilgi edinmeniz iyi olur. Örneğin, OAuth 2.0 ile kimlik doğrulama veya Node.js ile web uygulaması oluşturma gibi konuları inceleyebilirsiniz. Ancak bu konular ön koşul değildir.
İhtiyacınız Olanlar
- Node.js 8 veya üzeri
- Bağlı Nest Termostat'ı olan bir Google Hesabı
Neler Öğreneceksiniz?
- Statik web sayfaları ve Cloud Functions işlevleri barındıran bir Firebase projesi oluşturma
- Tarayıcı tabanlı bir web uygulaması üzerinden cihaz erişim istekleri gönderme
- İsteklerinizi yönlendirmek için Node.js ve Express ile bir proxy sunucusu oluşturma
2. Proje Oluşturma
Geliştiricilerin Cihaz Erişimi entegrasyonunu ayarlamak için bir Google Cloud Platform (GCP) projesi oluşturması gerekir. GCP projesinde oluşturulan istemci kimliği ve istemci gizli anahtarı, geliştiricinin uygulaması ile Google Cloud arasındaki OAuth akışının bir parçası olarak kullanılır. Geliştiricilerin Smart Device Management API'ye erişmek için bir proje oluşturmak üzere Cihaz Erişimi Konsolu'nu da ziyaret etmesi gerekir.
Google Cloud Platform
Google Cloud Platform'a gidin. Yeni proje oluştur'u tıklayın ve bir proje adı girin. Google Cloud için bir proje kimliği [GCP-Project-Id] de gösterilir. Lütfen bu kimliği kaydedin. Firebase kurulumu sırasında kullanacağız. (Bu kimliği bu Codelab boyunca [GCP-Project-Id] olarak adlandıracağız.)

İlk adım, projemizde gerekli API kitaplığını etkinleştirmektir. API'ler ve Hizmetler > Kitaplık'a gidin ve Smart Device Management API'sini arayın. Projenizin Cihaz Erişimi API çağrılarına istekte bulunmasına izin vermek için bu API'yi etkinleştirmeniz gerekir.

OAuth kimlik bilgileri oluşturmaya geçmeden önce projemiz için OAuth kullanıcı rızası ekranını yapılandırmamız gerekir. API'ler ve Hizmetler > OAuth kullanıcı rızası ekranı'na gidin. Kullanıcı Türü için harici'yi seçin. İlk ekranı tamamlamak için uygulamanızın adını, destek e-posta adresini ve geliştirici iletişim bilgilerini girin. Test Kullanıcıları istendiğinde bu adımda bağlı cihazların e-posta adresini sağladığınızdan emin olun.
OAuth kullanıcı rızası ekranınızı yapılandırdıktan sonra API'ler ve Hizmetler > Kimlik Bilgileri'ne gidin. +Kimlik bilgileri oluştur'u tıklayın ve OAuth istemci kimliği'ni seçin. Uygulama türü olarak Web uygulaması'nı seçin.

Müşteriniz için bir ad girin ve OLUŞTUR'u tıklayın. Yetkilendirilmiş JavaScript kaynağı ve yetkilendirilmiş yönlendirme URI'si daha sonra eklenecektir. Bu işlemi tamamladığınızda, bu OAuth 2.0 istemcisiyle ilişkili [Client-Id] ve [Client-Secret] gösterilir.

Cihaz Erişim Konsolu
Cihaz Erişim Konsolu'na gidin. Cihaz Erişimi Konsolu'nu daha önce kullanmadıysanız Hizmet Şartları sözleşmesi ve 5 ABD doları tutarındaki kayıt ücretiyle karşılaşırsınız.
Yeni bir proje oluşturun ve projeye bir ad verin. Sonraki pencerede, önceki adımda GCP'den aldığınız [Client-Id] değerini girin.

Etkinlikleri etkinleştirdikten ve proje oluşturma adımlarını tamamladıktan sonra projenizin ana sayfasına yönlendirilirsiniz. [Project-Id], projenize verdiğiniz adın altında listelenir.

Smart Device Management API'ye istek gönderirken kullanacağımız için lütfen [Project-Id] değerinizi not edin.
3. Firebase Kurulumu
Firebase, geliştiricilere web uygulamalarını dağıtmak için hızlı ve kolay bir yöntem sunar. Firebase'i kullanarak Cihaz Erişimi entegrasyonumuz için istemci tarafı bir web uygulaması geliştireceğiz.
Firebase projesi oluşturma
Firebase Console'a gidin. Proje Ekle'yi tıklayın ve Proje Oluşturma adımında oluşturduğunuz projeyi seçin. Bu işlem, GCP projenize [GCP-Project-Id] bağlanacak bir Firebase projesi oluşturur.
Firebase projesi başarıyla oluşturulduktan sonra aşağıdaki ekranı görürsünüz:

Firebase Araçları'nı yükleme
Firebase, uygulamanızı oluşturup dağıtmak için bir dizi CLI aracı sunar. Bu araçları yüklemek için yeni bir terminal penceresi açıp aşağıdaki komutu çalıştırın. Bu işlem, Firebase araçlarını genel olarak yükler.
$ npm i -g firebase-tools
Firebase araçlarının doğru şekilde yüklendiğini doğrulamak için sürüm bilgilerini kontrol edin.
$ firebase --version
Oturum açma komutuyla Google Hesabınızla Firebase CLI araçlarında oturum açabilirsiniz.
$ firebase login
Barındırma projesini başlatma
Giriş yaptıktan sonraki adım, web uygulamanız için bir barındırma projesi başlatmaktır. Terminalden, projenizi oluşturmak istediğiniz klasöre gidin ve aşağıdaki komutu çalıştırın:
$ firebase init hosting
Firebase, bir hosting projesine başlamanıza yardımcı olmak için size bir dizi soru sorar:
- Lütfen bir seçenek belirleyin: Mevcut bir projeyi kullan
- Bu dizin için varsayılan bir Firebase projesi seçin: Seç ***[GCP-Project-Id]***
- Herkese açık dizininiz olarak neyi kullanmak istiyorsunuz? — Herkese açık
- Tek sayfa uygulaması olarak yapılandırılıyor mu? — Evet
- GitHub ile otomatik derleme ve dağıtım ayarlama — Hayır
Projeniz başlatıldıktan sonra aşağıdaki komutla Firebase'e dağıtabilirsiniz:
$ firebase deploy
Firebase, projenizi tarar ve gerekli dosyaları bulut barındırmaya dağıtır.

Barındırma URL'sini bir tarayıcıda açtığınızda, yeni dağıttığınız sayfayı görmeniz gerekir:

Firebase ile web sayfası dağıtma hakkında temel bilgileri edindiğinize göre artık Codelab örneğimizi dağıtabiliriz.
4. Codelab Örneği
GitHub'da barındırılan codelab deposunu aşağıdaki komutu kullanarak klonlayabilirsiniz:
$ git clone https://github.com/google/device-access-codelab-web-app.git
Bu depoda, iki ayrı klasörde örnekler sunuyoruz. codelab-start klasöründe, bu Codelab'de mevcut noktadan başlamanız için gereken dosyalar bulunur. codelab-done klasörü, tam işlevli istemci ve node.js sunucusuyla birlikte bu Codelab'in eksiksiz bir sürümünü içerir.
Bu codelab boyunca codelab-start klasöründeki dosyaları kullanacağız. Ancak herhangi bir noktada takılırsanız codelab'in tamamlanmış sürümüne de başvurabilirsiniz.
Codelab Örnek Dosyaları
codelab-start klasörünün dosya yapısı aşağıdaki gibidir:
public ├───index.html ├───scripts.js ├───style.css firebase.json
Herkese açık klasör, uygulamamızın statik sayfalarını içerir. firebase.json, web isteklerini uygulamamıza yönlendirmekten sorumludur. codelab-done sürümünde, proxy sunucumuzun (express) Google Cloud işlevlerine dağıtılması için mantık içeren bir functions dizini de görürsünüz.
Codelab örneğini dağıtma
Dosyaları codelab-start klasöründen projenizin dizinine kopyalayın.
$ firebase deploy
Firebase dağıtımı tamamladığında Codelab uygulamasını görebilirsiniz:

Kimlik doğrulama akışının başlatılması için iş ortağı kimlik bilgileri gerekir. Bu bilgileri bir sonraki bölümde ele alacağız.
5. OAuth'u işleme
OAuth, erişim yetkisi verme için kullanılan web standardıdır. Genellikle kullanıcıların şifrelerini paylaşmadan üçüncü taraf uygulamalarına hesap bilgilerine erişim izni vermesi için kullanılır. Geliştiricilerin Cihaz Erişimi aracılığıyla kullanıcı cihazlarına erişmesini sağlamak için OAuth 2.0'ı kullanırız.

Yönlendirme URI'sini belirtin
OAuth akışının ilk adımında, bir dizi parametre Google OAuth 2.0 uç noktasına iletilir. Kullanıcı izni alındıktan sonra Google OAuth sunucuları, yönlendirme URI'nize yetkilendirme kodu içeren bir istek gönderir.
SERVER_URI sabitini (19. satır) scripts.js içinde kendi barındırma URL'nizle güncelleyin:
const SERVER_URI = "https://[GCP-Project-Id].web.app";
Uygulamayı bu değişiklikle yeniden dağıtmak, projeniz için kullanılan yönlendirme URI'nizi günceller.
$ firebase deploy
Yönlendirme URI'sini etkinleştirme
Yönlendirme URI'sini komut dosyaları dosyasında güncelledikten sonra, projeniz için oluşturduğunuz istemci kimliğinin izin verilen yönlendirme URI'leri listesine de eklemeniz gerekir. Google Cloud Platform'da Kimlik Bilgileri Sayfası'na gidin. Bu sayfada projeniz için oluşturulan tüm kimlik bilgileri listelenir:

OAuth 2.0 İstemci Kimlikleri listesinde, Proje Oluşturma adımında oluşturduğunuz istemci kimliğini seçin. Uygulamanızın yönlendirme URI'sini projenizin Yetkilendirilmiş Yönlendirme URI'leri listesine ekleyin.

Oturum açmayı deneyin.
Firebase ile ayarladığınız Hosting URL'sine gidin, iş ortağı kimlik bilgilerinizi girin ve SIGN IN (OTURUM AÇ) düğmesini tıklayın. İstemci kimliği ve istemci gizli anahtarı, Google Cloud Platform'dan aldığınız kimlik bilgileridir. Proje kimliği ise Cihaz Erişim Konsolu'ndan alınır.

OTURUM AÇ düğmesi, kullanıcılarınızı işletmeniz için OAuth akışında yönlendirir. Bu akış, Google Hesaplarının oturum açma ekranıyla başlar. Kullanıcılardan oturum açtıktan sonra, Nest cihazlarına erişmek için projenize izin vermeleri istenir.

Bu bir sahte uygulama olduğundan Google, yönlendirme yapmadan önce uyarı yayınlayacaktır.

"Gelişmiş"i tıklayın, ardından uygulamanıza yönlendirme işlemini tamamlamak için "web.app'e git (güvenli değil)"i seçin.

Bu işlem, gelen GET isteğinin bir parçası olarak bir OAuth kodu sağlar. Uygulama daha sonra bu kodu bir erişim jetonu ve bir yenileme jetonuyla değiştirir.
6. Cihaz denetimi
Cihaz Erişimi örnek uygulaması, Google Nest cihazlarını kontrol etmek için Smart Device Management REST API çağrılarını kullanır. Bu çağrılar, belirli komutlar için gereken bir yükle birlikte GET veya POST isteğinin üstbilgisinde erişim jetonunun iletilmesini içerir.
Bu çağrıları işlemek için genel bir erişim isteği işlevi yazdık. Ancak bu işlev için doğru uç noktayı ve gerektiğinde yük nesnesini sağlamanız gerekir.
function deviceAccessRequest(method, call, localpath, payload = null) {...}
- method: HTTP isteğinin türü (
GETveyaPOST)) - call: Yanıtları yönlendirmek için kullanılan (
listDevices,thermostatMode,temperatureSetpoint) API çağrımızı temsil eden bir dize. - localpath: İsteğin gönderildiği uç nokta. Proje kimliğini ve cihaz kimliğini içerir (
https://smartdevicemanagement.googleapis.com/v1sonrasına eklenir). - yük (*) — API çağrısı için gereken ek veriler (ör. bir istenen ayar için sıcaklığı temsil eden sayısal değer)
Nest Thermostat'ı kontrol etmek için örnek kullanıcı arayüzü kontrolleri (Cihazları Listele, Modu Ayarla, Sıcaklığı Ayarla) oluşturacağız:

Bu kullanıcı arayüzü kontrolleri, scripts.js'deki ilgili işlevleri (listDevices(), postThermostatMode(), postTemperatureSetpoint()) çağırır. Bu alanlar, sizin uygulamanız için boş bırakılmıştır. Amaç, doğru yöntemi/yolu seçip yükü deviceAccessRequest(...) işlevine iletmektir.
Cihazları Listeleme
En basit Cihaz Erişimi çağrısı listDevices'dır. GET isteği kullanır ve yük gerektirmez. Uç nokta, projectId kullanılarak yapılandırılmalıdır. listDevices() işlevinizi aşağıdaki gibi tamamlayın:
function listDevices() {
var endpoint = "/enterprises/" + projectId + "/devices";
deviceAccessRequest('GET', 'listDevices', endpoint);
}
Değişikliklerinizi kaydedin ve Firebase projenizi aşağıdaki komutla tekrar dağıtın:
$ firebase deploy
Uygulamanın yeni sürümü dağıtıldıktan sonra sayfayı yeniden yükleyip CİHAZLARI LİSTELE'yi tıklayın. Bu işlem, Cihaz Kontrolü bölümündeki listeyi doldurur. Bu listede termostatınızın kimliğini görürsünüz:

Listeden cihaz seçtiğinizde scripts.js dosyasındaki deviceId alanı güncellenir. Sonraki iki kontrol için, kontrol etmek istediğimiz cihaza ait deviceId değerini belirtmemiz gerekir.
Termostat Kontrolü
Smart Device Management API'de Nest Thermostat'ın temel kontrolü için iki özellik bulunur. ThermostatMode ve TemperatureSetpoint. ThermostatMode, Nest termostatınızın modunu dört farklı moddan birine ayarlar: {Off, Heat, Cool, HeatCool}. Ardından, seçilen modu yükün bir parçası olarak sağlamamız gerekir.
scripts.js içindeki postThermostatMode() işlevinizi aşağıdakiyle değiştirin:
function postThermostatMode() {
var endpoint = "/enterprises/" + projectId + "/devices/" + deviceId + ":executeCommand";
var tempMode = id("tempMode").value;
var payload = {
"command": "sdm.devices.commands.ThermostatMode.SetMode",
"params": {
"mode": tempMode
}
};
deviceAccessRequest('POST', 'thermostatMode', endpoint, payload);
}
Bir sonraki işlev olan postTemperatureSetpoint(), Nest Thermostat'ınızın sıcaklığını (Celsius cinsinden) ayarlamayı sağlar. Seçilen termostat moduna bağlı olarak yükte ayarlanabilen iki parametre vardır: heatCelsius ve coolCelsius.
function postTemperatureSetpoint() {
var endpoint = "/enterprises/" + projectId + "/devices/" + deviceId + ":executeCommand";
var heatCelsius = parseFloat(id("heatCelsius").value);
var coolCelsius = parseFloat(id("coolCelsius").value);
var payload = {
"command": "",
"params": {}
};
if ("HEAT" === id("tempMode").value) {
payload.command = "sdm.devices.commands.ThermostatTemperatureSetpoint.SetHeat";
payload.params["heatCelsius"] = heatCelsius;
}
else if ("COOL" === id("tempMode").value) {
payload.command = "sdm.devices.commands.ThermostatTemperatureSetpoint.SetCool";
payload.params["coolCelsius"] = coolCelsius;
}
else if ("HEATCOOL" === id("tempMode").value) {
payload.command = "sdm.devices.commands.ThermostatTemperatureSetpoint.SetRange";
payload.params["heatCelsius"] = heatCelsius;
payload.params["coolCelsius"] = coolCelsius;
} else {
console.log("Off and Eco mode don't allow this function");
return;
}
deviceAccessRequest('POST', 'temperatureSetpoint', endpoint, payload);
}
7. Node.js sunucusu (isteğe bağlı)
Tebrikler! Tarayıcıdan Smart Device Management API istekleri gönderebilen bir istemci taraflı web uygulaması oluşturmuş olmanız gerekir. Sunucu tarafında geliştirme yapmak isteyenler için, tarayıcıdan gelen isteklerinizi yönlendirebilen bir proxy sunucuyla bu süreci hızlandırmak istiyoruz.
Bu proxy sunucusu için Firebase Cloud Functions, Node.js ve Express'i kullanacağız.
Cloud Functions'ı başlatma
Yeni bir terminal penceresi açın, proje dizininize gidin ve aşağıdaki komutu çalıştırın:
$ firebase init functions
Firebase, Cloud Functions'ı başlatmak için size bir dizi soru sorar:
- Cloud Functions yazmak için hangi dili kullanmak istiyorsunuz? — JavaScript
- Olası hataları yakalamak ve stili zorunlu kılmak için ESLint'i kullanmak istiyor musunuz? — Hayır
- Bağımlılıkları şimdi npm ile yüklemek istiyor musunuz? — Evet
Bu işlem, projenizde bir functions klasörünü başlatır ve gerekli bağımlılıkları yükler. Proje klasörünüzde, bulut işlevlerimizi tanımlamak için index.js dosyası, ayarları tanımlamak için package.json dosyası ve bağımlılıkları içeren node_modules dizini bulunduğunu görürsünüz.
Sunucu tarafı işlevselliğini oluşturmak için iki npm kitaplığı kullanacağız: express ve xmlhttprequest. package.json dosyasındaki bağımlılıklar listesine aşağıdaki girişleri eklemeniz gerekir:
"xmlhttprequest": "^1.8.0", "express": "^4.17.0"
Ardından, functions dizininden npm install komutunu çalıştırdığınızda projenizin bağımlılıkları yüklenir:
$ npm install
npm'nin paketleri indirmeyle ilgili bir sorun yaşaması durumunda, aşağıdaki komutla xmlhttprequest ve express'i açıkça kaydetmeyi deneyebilirsiniz:
$ npm install express xmlhttprequest --save
Blaze planına geçme
firebase deploy komutunu kullanmak için Blaze planına yükseltmeniz gerekir. Bu plan için hesabınıza bir ödeme yöntemi eklemeniz gerekir. Proje Genel Bakış > Kullanım ve faturalandırma'ya gidin ve projeniz için Blaze planını seçtiğinizden emin olun.

Express sunucusu oluşturma
Bir Express sunucusu, gelen GET ve POST isteklerine yanıt vermek için basit bir çerçeve kullanır. POST isteklerini dinleyen, bunları yükte belirtilen bir hedef URL'ye ileten ve aktarımdan alınan yanıtla yanıt veren bir servlet oluşturduk.
İşlevler dizinindeki index.js dosyanızı aşağıdaki gibi görünecek şekilde değiştirin:
const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
const functions = require('firebase-functions');
const express = require('express');
const http = require('http');
const app = express();
app.use(express.json());
//***** Device Access - Proxy Server *****//
// Serving Get Requests (Not used)
app.get('*', (request, response) => {
response.status(200).send("Hello World!");
});
// Serving Post Requests
app.post('*', (request, response) => {
setTimeout(() => {
// Read the destination address from payload:
var destination = request.body.address;
// Create a new proxy post request:
var xhr = new XMLHttpRequest();
xhr.open('POST', destination);
// Add original headers to proxy request:
for (var key in request.headers) {
var value = request.headers[key];
xhr.setRequestHeader(key, value);
}
// Add command/parameters to proxy request:
var newBody = {};
newBody.command = request.body.command;
newBody.params = request.body.params;
// Respond to original request with the response coming
// back from proxy request (to Device Access Endpoint)
xhr.onload = function () {
response.status(200).send(xhr.responseText);
};
// Send the proxy request!
xhr.send(JSON.stringify(newBody));
}, 1000);
});
// Export our app to firebase functions:
exports.app = functions.https.onRequest(app);
İstekleri sunucumuza yönlendirmek için firebase.json yeniden yazma işlemlerini aşağıdaki gibi ayarlamamız gerekir:
{
"hosting": {
"public": "public",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [{
"source": "/proxy**",
"function": "app"
},{
"source": "**",
"destination": "/index.html"
}
]
}
}
Bu işlem, /proxy ile başlayan URL'leri Express sunucumuza yönlendirir. Diğer URL'ler ise index.html sunucumuza yönlendirilmeye devam eder.
Proxy API Çağrıları
Sunucumuz hazır olduğuna göre, tarayıcımızın bu adrese istek göndermesi için scripts.js içinde bir proxy URI'si tanımlayalım:
const PROXY_URI = SERVER_URI + "/proxy";
Ardından, dolaylı Cihaz Erişimi çağrıları için deviceAccessRequest(...) işleviyle aynı imzaya sahip olan proxyRequest işlevi scripts.js ekleyin.
function proxyRequest(method, call, localpath, payload = null) {
var xhr = new XMLHttpRequest();
// We are doing our post request to our proxy server:
xhr.open(method, PROXY_URI);
xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
xhr.onload = function () {
// Response is passed to deviceAccessResponse function:
deviceAccessResponse(call, xhr.response);
};
// We are passing the device access endpoint in address field of the payload:
payload.address = "https://smartdevicemanagement.googleapis.com/v1" + localpath;
if ('POST' === method && payload)
xhr.send(JSON.stringify(payload));
else
xhr.send();
}
Son adım, deviceAccessRequest(...) çağrılarını scripts.js içindeki postThermostatMode() ve postTemperatureSetpoint() işlevlerinde proxyRequest(...) işleviyle değiştirmektir.
Uygulamayı güncellemek için firebase deploy komutunu çalıştırın.
$ firebase deploy
Böylece, Cloud Functions'ta Express'i kullanan çalışan bir Node.js proxy sunucunuz olur.
Cloud Functions izinleri verme
Son adım, bulut işlevlerinizin erişim izinlerini incelemek ve istemci tarafı uygulamanızın bunları çağırabildiğinden emin olmaktır.
Google Cloud Platform'da menüden Cloud Functions sekmesine gidin ve ardından Cloud Function'ınızı seçin:

İzinler'i, ardından Üye Ekle'yi tıklayın. Yeni üye alanına allUsers yazın ve rol olarak Cloud Functions > Cloud Functions Invoker'ı seçin. Kaydet'i tıkladığınızda bir uyarı mesajı gösterilir:

Herkese açık erişime izin ver'i seçtiğinizde istemci tarafı uygulamanız, Cloud Function'ınızı kullanabilir.
Tebrikler, tüm adımları tamamladınız. Artık web uygulamanıza gidebilir ve proxy sunucunuz üzerinden yönlendirilen cihaz kontrollerini deneyebilirsiniz.
Sonraki Adımlar
Cihaz erişimi konusundaki uzmanlığınızı artırmanın yollarını mı arıyorsunuz? Diğer Nest cihazlarını kontrol etme hakkında daha fazla bilgi edinmek için özellikler dokümanlarını, ürününüzü dünya genelinde kullanıma sunma adımlarını öğrenmek için ise sertifika sürecini inceleyin.
Codelab deneyiminizi temel alarak Nest kameraları, kapı zillerini ve termostatları kontrol etmek için çalışan bir web uygulaması dağıtacağınız Device Access web uygulaması örnek uygulaması ile becerilerinizi daha da geliştirin.