Wednesday, September 09, 2015

Nest Thermostat y R - Creándo un Dashboard con Shiny

Este post fué posteado originalmente en Nest Thermostat and R - Creating a Shiny dashboard.



Si eres un empleado de SAP, por favor siguenos en Jam.

En el d-shop siempre estamos buscándo jugar con las últimas tecnologías...y  pesar de que el Nest Thermostat no es realmente "nuevo", estámos en el proceso de adquirir uno.

Por ahora, estamos felices de poder jugar un poco con el Nest Home Simulator disponible en la tienda de Google Chrome.

En este blog, vamos a utilizar el Nest Home Simulator, el lenguaje de programación estadístico R y el Shiny package, que nos permite crear impresionántes páginas web para manejar datos. También, vamos a necesitar el RJson package.

El primer paso va a ser crear un usuario en el Nest Developer Program e instalar Nest Home Simulator.


Cuándo nos logeamos en el Simulador, vamos a poder crear un termóstato para poder comenzar a jugar con las temperaturas actual y proyectada...


El segundo punto importánte, es que cuando estemos logeados en el Nest Developer Program vamos a poder crear un cliente que se va a comunicar con nuestro termostato y también, vamos a poder generar un número especial con el cual vamos a poder interactuar con el mismo.


Solo necesitamos copiar y pegar el URL del Authorization URL y luego de aceptar las condiciones un número va a ser presentado...vamos a necesitar este número para nuestro código en R...pero tengan en cuenta que una vez que se cierra la conexión, vamos a tener que generar un número nuevo...


Ahora, estamos listos para poder comenzar a programar un poco...cuando trabajamos con R, es siempre mejor utilizar RStudio...así que copien y peguen este código...y recuerden reemplazar el valir de la variable code con su propio número...también van a tener que reemplazar el Client ID y el Client Secret con la información del Cliente de su Nest Developer Program...

Nest_Dashboard.R
library("shiny")
library("rjson")

if(!exists("access_code")){
  code<-"XXX"
  info_data<-data.frame(Humidity=integer(),
  Current_Temperature=integer(),Target_Temperature=integer(),Times=character())
  access_code<-system(sprintf('curl -X POST 
  "https://api.home.nest.com/oauth2/access_token?client_id=XXX&code=%s&
  client_secret=XXX&grant_type=authorization_code"',code),intern=T)
  document<-fromJSON(access_code)
  access<-document$access_token
  devices<-paste("https://developer-api.nest.com/devices?auth=",access,sep="")
  all_devices<-system(sprintf('curl -L -X GET -H "Accept: application/json" "%s"',devices),intern=T)
  device<-gsub("thermostats|:|{|\"|humidity.*","",all_devices,perl=T)
  themostat_code<-paste("https://developer-api.nest.com/devices/thermostats/",device,"?auth=",access,sep="")
}

get_nest_info = function(info_data){
    thermostat<-system(sprintf('curl -L -X GET -H "Accept: application/json" "%s"',themostat_code),intern=T)
    info<-fromJSON(thermostat)
    timeframe<-Sys.time()
    timeframe<-gsub("\\d+-\\d+-\\d+\\s","",timeframe)
    new_data<-data.frame(Humidity=info$humidity,Current_Temperature=info$ambient_temperature_f,
    Target_Temperature=info$target_temperature_f,Times=timeframe,stringsAsFactors = F)
    if(nrow(info_data)==10){
      info_data<-info_data[-1,]
    }
    info_data<-rbind(info_data,new_data)
  return(info_data)
}

runApp(list(
  ui = pageWithSidebar(    
    
    headerPanel("Nest Dashboard"),
    
    sidebarPanel(
    ),
    
    mainPanel(
      plotOutput("nestPlot")
    )
  ),
  server =function(input, output, session) {
    autoInvalidate <- reactiveTimer(10000, session)
      output$nestPlot <- renderPlot({
        autoInvalidate()
        info_data<<-get_nest_info(info_data) 
        plot(info_data$Current_Temperature,type="n",axes=F,ann=F)
        lines(info_data$Current_Temperature,col="blue")
        lines(info_data$Target_Temperature,col="red")
        points(info_data$Current_Temperature, pch=21, bg="lightcyan", cex=1.25)
        points(info_data$Target_Temperature, pch=21, bg="lightcyan", cex=1.25)
        box()
        xy<-length(info_data$Times)
        axis(2, col.axis="blue", las=1)
        axis(1, at=1:xy, lab=info_data$Times, col.axis="purple")
        legend("topright",c("Current Temp","Target Temp"),lty=c(1,1),col=c("blue","red"),bty="n")
    })
  }
))

Este código va a obtener 10 medidas antes de refrescarse a si mismo y obtener 10 nuevas medidas. Así que podemos actualizar las temperaturas actuales y proyectadas para poder ver como el Dashboard cambia...



Saludos,

Blag.
Development Culture.

No comments: