Download Events Data

So I’ve been trying to tackle this as well. As mentioned above, Initial State does it pretty well, but unless you pay $6 a month you can only see 24 hrs’ worth of data at a time. I want to be able to download the raw data for as far back as possible and work with it in excel, so Initial State won’t due because I’m not willing to subscribe to their pay option.

I came across GroveStreams which is a lot like Initial State, but there doesn’t appear to be a limit on how much data is accessible for their free tier. (I’ve only been using it for a day so far.) They’ve got a smartapp that’s setup to collect temperature and contact sensor data ( here’s a guide for setting it up, as is ). It’s pretty simple, and I was able to modify it to send Thermostat Operating State and Heating Setpoint. Below is the original code with my additions for thermostat set point and operating state. I found another iteration of his smartapp with a lot more data streams (still no thermostat operating state and setpoint though)

     /**
      * SmartThings example Code for GroveStreams
      * A full "how to" guide for this example can be found at https://www.grovestreams.com/developers/getting_started_smartthings.html
      *
      * Copyright 2015 Jason Steele
      *
      * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
      * in compliance with the License. You may obtain a copy of the License at:
      *
      * http://www.apache.org/licenses/LICENSE-2.0
      *
      * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
      * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
      * for the specific language governing permissions and limitations under the License.
      *
      */
  
     definition(
                 name: "GroveStreams w/ Thermostat Info",
                 namespace: "JasonBSteele",
                 author: "Jason Steele",
                 description: "Log to GroveStreams",
                 category: "My Apps",
                 iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png",
                 iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png",
                 iconX3Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png")
  
     preferences {
         section("Log devices...") {
                 input "contacts", "capability.contactSensor", title: "Doors open/close", required: false, multiple: true
                 input "temperatures", "capability.temperatureMeasurement", title: "Temperatures", required:false, multiple: true
                 input "thermostats", "capability.thermostat", title: "Thermostats", required: false, multiple: true
        }
  
         section ("GroveStreams Feed PUT API key...") {
                 input "channelKey", "text", title: "API key"
         }
     }
  
     def installed() {
         initialize()
 }
  
 def updated() {
         unsubscribe()
         initialize()
 }
  
 def initialize() {
         subscribe(temperatures, "temperature", handleTemperatureEvent)
         subscribe(contacts, "contact", handleContactEvent)
 		subscribe(thermostats,"heatingSetpoint", handleHeatingSetpointEvent)
 		subscribe(thermostats, "thermostatOperatingState", handleThermostatOperatingStateEvent)
         
 //        devices.capabilities.each {cap ->
 //    log.debug "This device supports the ${cap.name} capability" }
 }
  
 def handleTemperatureEvent(evt) {
         sendValue(evt) { it.toString() }
 }
  
 def handleContactEvent(evt) {
         sendValue(evt) { it == "open" ? "true" : "false" }
 }
 
 def handleHeatingSetpointEvent(evt) {
 		sendValue(evt) { it.toString() }
 }
  
 def handleThermostatOperatingStateEvent(evt) {
 		sendValue(evt) { it.toString() }
 } 
  
 private sendValue(evt, Closure convert) {
         def compId = URLEncoder.encode(evt.displayName.trim())
         def streamId = evt.name
         def value = convert(evt.value)
        
         log.debug "Logging to GroveStreams ${compId}, ${streamId} = ${value}"
        
         def url = "https://grovestreams.com/api/feed?api_key=${channelKey}&compId=${compId}&${streamId}=${value}"
         def putParams = [
                 uri: url,
                 body: []]
  
         httpPut(putParams) { response ->
                 if (response.status != 200 ) {
                         log.debug "GroveStreams logging failed, status = ${response.status}"
                 }
         }
    }