/** * V1.0.0 Init try * V1.0.1 Added Cobra update code * * Copyright 2019 Craig Romei * * 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. * */ metadata { definition (name: "ThermostatHistoryTileDisplay", namespace: "napalmcsr", author: "Craig Romei") { capability "Sensor" command "clearData", ["string"] command "SetToday", ["string"] command "SetYesterday", ["string"] command "SetTwoDaysAgo", ["string"] command "SetThreeDaysAgo", ["string"] command "SetFourDaysAgo", ["string"] command "SetFiveDaysAgo", ["string"] command "SetSixDaysAgo", ["string"] command "SetSevenDaysAgo", ["string"] command "refresh" command "SetDailyCooling", ["NUMBER"] command "SetDailyFan", ["NUMBER"] command "SetDailyHeating", ["NUMBER"] command "SetDailyIdle", ["NUMBER"] command "SetDailyPendCool", ["NUMBER"] command "SetDailyPendHeat", ["NUMBER"] command "SetDailyVentEcon", ["NUMBER"] attribute "Today", "string" attribute "Yesterday", "string" attribute "TwoDaysAgo", "string" attribute "ThreeDaysAgo", "string" attribute "FourDaysAgo", "string" attribute "FiveDaysAgo", "string" attribute "SixDaysAgo", "string" attribute "SevenDaysAgo", "string" attribute "DriverAuthor", "string" attribute "DriverVersion", "string" attribute "DriverStatus", "string" attribute "DriverUpdate", "string" attribute "DailyTotalHeating", "NUMBER" attribute "DailyTotalCooling", "NUMBER" attribute "DailyTotalIdle", "NUMBER" attribute "DailyTotalFan", "NUMBER" attribute "DailyTotalVentEcon", "NUMBER" attribute "DailyTotalPendHeat", "NUMBER" attribute "DailyTotalPendCool", "NUMBER" } preferences() {input( name : "logLevel" ,title : "IDE logging level" ,multiple : false ,required : true ,type : "enum" ,options : getLogLevels() ,submitOnChange : false ,defaultValue : "0" ) } } def initialize(){updated()} def updated() { infolog "Updated - Start" version() initialState() infolog "Updated - End" } def clearData(){ infolog "clearData - Start" state.TodayData = "Awaiting Data" state.YesterdayData = "Awaiting Data" state.TwoDaysAgoData = "Awaiting Data" state.ThreeDaysAgoData = "Awaiting Data" state.FourDaysAgoData = "Awaiting Data" state.FiveDaysAgoData = "Awaiting Data" state.SixDaysAgoData = "Awaiting Data" state.SevenDaysAgoData = "Awaiting Data" sendEvent(name: "Today", value: state.TodayData, isStateChange: true) sendEvent(name: "Yesterday", value: state.YesterdayData) sendEvent(name: "TwoDaysAgo", value: state.TwoDaysAgoData) sendEvent(name: "ThreeDaysAgo", value: state.ThreeDaysAgoData) sendEvent(name: "FourDaysAgo", value: state.FourDaysAgoData) sendEvent(name: "FiveDaysAgo", value: state.FiveDaysAgoData) sendEvent(name: "SixDaysAgo", value: state.SixDaysAgoData) sendEvent(name: "SevenDaysAgo", value: state.SevenDaysAgoData) infolog "clearData - End" } def initialState(){ infolog "initialState - Start" state.TodayData = "Awaiting Data" state.YesterdayData = "Awaiting Data" state.TwoDaysAgoData = "Awaiting Data" state.ThreeDaysAgoData = "Awaiting Data" state.FourDaysAgoData = "Awaiting Data" state.FiveDaysAgoData = "Awaiting Data" state.SixDaysAgoData = "Awaiting Data" state.SevenDaysAgoData = "Awaiting Data" sendEvent(name: "Today", value: state.TodayData) sendEvent(name: "Yesterday", value: state.YesterdayData) sendEvent(name: "TwoDaysAgo", value: state.TwoDaysAgoData) sendEvent(name: "ThreeDaysAgo", value: state.ThreeDaysAgoData) sendEvent(name: "FourDaysAgo", value: state.FourDaysAgoData) sendEvent(name: "FiveDaysAgo", value: state.FiveDaysAgoData) sendEvent(name: "SixDaysAgo", value: state.SixDaysAgoData) sendEvent(name: "SevenDaysAgo", value: state.SevenDaysAgoData) infolog "initialState - End" } def SetToday(TodayData){ infolog "SetToday - Start" state.TodayData = TodayData if(state.TodayData.length() > 1024){ debuglog("Too many characters!") sendEvent(name: "Today", value: "Too many characters!", isStateChange: true) } debuglog( "Attribute Content: ${state.TodayData}") sendEvent(name: "Today", value: state.TodayData, isStateChange: true) infolog "SetToday - End" } def SetYesterday(YesterdayData){ infolog "SetYesterday - Start" state.YesterdayData = YesterdayData if(state.YesterdayData.length() > 1024){ debuglog("Too many characters!") sendEvent(name: "Yesterday", value: "Too many characters!", isStateChange: true) } debuglog( "Attribute Content: ${state.YesterdayData}") sendEvent(name: "Yesterday", value: state.YesterdayData, isStateChange: true) infolog "SetYesterday - End" } def SetTwoDaysAgo(TwoDaysAgoData){ infolog "SetTwoDaysAgo - Start" state.TwoDaysAgoData = TwoDaysAgoData if(state.TwoDaysAgoData.length() > 1024){ debuglog("Too many characters!") sendEvent(name: "TwoDaysAgo", value: "Too many characters!", isStateChange: true) } debuglog( "Attribute Content: ${state.TwoDaysAgoData}") sendEvent(name: "TwoDaysAgo", value: state.TwoDaysAgoData, isStateChange: true) infolog "SetTwoDaysAgo - End" } def SetThreeDaysAgo(ThreeDaysAgoData){ infolog "SetThreeDaysAgo - Start" state.ThreeDaysAgoData = ThreeDaysAgoData if(state.ThreeDaysAgoData.length() > 1024){ debuglog("Too many characters!") sendEvent(name: "ThreeDaysAgo", value: "Too many characters!", isStateChange: true) } debuglog( "Attribute Content: ${state.ThreeDaysAgoData}") sendEvent(name: "ThreeDaysAgo", value: state.ThreeDaysAgoData, isStateChange: true) infolog "SetThreeDaysAgo - End" } def SetFourDaysAgo(FourDaysAgoData){ infolog "SetFourDaysAgo - Start" state.FourDaysAgoData = FourDaysAgoData if(state.FourDaysAgoData.length() > 1024){ debuglog("Too many characters!") sendEvent(name: "FourDaysAgo", value: "Too many characters!", isStateChange: true) } debuglog( "Attribute Content: ${state.FourDaysAgoData}") sendEvent(name: "FourDaysAgo", value: state.FourDaysAgoData, isStateChange: true) infolog "SetFourDaysAgo - End" } def SetFiveDaysAgo(FiveDaysAgoData){ infolog "SetFiveDaysAgo - Start" state.FiveDaysAgoData = FiveDaysAgoData if(state.FiveDaysAgoData.length() > 1024){ debuglog("Too many characters!") sendEvent(name: "FiveDaysAgo", value: "Too many characters!", isStateChange: true) } debuglog( "Attribute Content: ${state.FiveDaysAgoData}") sendEvent(name: "FiveDaysAgo", value: state.FiveDaysAgoData, isStateChange: true) infolog "SetFiveDaysAgo - End" } def SetSixDaysAgo(SixDaysAgoData){ infolog "SetSixDaysAgo - Start" state.SixDaysAgoData = SixDaysAgoData if(state.SixDaysAgoData.length() > 1024){ debuglog("Too many characters!") sendEvent(name: "SixDaysAgo", value: "Too many characters!", isStateChange: true) } debuglog( "Attribute Content: ${state.SixDaysAgoData}") sendEvent(name: "SixDaysAgo", value: state.SixDaysAgoData, isStateChange: true) infolog "SetSixDaysAgo - End" } def SetSevenDaysAgo(SevenDaysAgoData){ infolog "SetSevenDaysAgo - Start" state.SevenDaysAgoData = SevenDaysAgoData if(state.SevenDaysAgoData.length() > 1024){ debuglog("Too many characters!") sendEvent(name: "SevenDaysAgo", value: "Too many characters!", isStateChange: true) } debuglog( "Attribute Content: ${state.SevenDaysAgoData}") sendEvent(name: "SevenDaysAgo", value: state.SevenDaysAgoData, isStateChange: true) infolog "SetSevenDaysAgo - End" } def refresh(){ infolog "Refresh - Start" sendEvent(name: "Today", value: state.TodayData, isStateChange: true) sendEvent(name: "Today", value: state.YesterdayData, isStateChange: true) } def SetDailyIdle(TimeinHours){ infolog "SetDailyIdle - Start" sendEvent(name: "DailyTotalIdle", value: TimeinHours, isStateChange: true) } def SetDailyCooling(TimeinHours){ infolog "SetDailyCooling - Start" sendEvent(name: "DailyTotalCooling", value: TimeinHours, isStateChange: true) } def SetDailyFan(TimeinHours){ infolog "SetDailyFan - Start" sendEvent(name: "DailyTotalFan", value: TimeinHours, isStateChange: true) } def SetDailyHeating(TimeinHours){ infolog "SetDailyHeating - Start" sendEvent(name: "DailyTotalHeating", value: TimeinHours, isStateChange: true) } def SetDailyPendHeat(TimeinHours){ infolog "SetDailyPreHeat - Start" sendEvent(name: "DailyTotalPendHeat", value: TimeinHours, isStateChange: true) } def SetDailyVentEcon(TimeinHours){ infolog "SetDailyVentEcon - Start" sendEvent(name: "DailyTotalVentEcon", value: TimeinHours, isStateChange: true) } def SetDailyPendCool(TimeinHours){ infolog "SetDailyPreCool - Start" sendEvent(name: "DailyTotalPendCool", value: TimeinHours, isStateChange: true) } def debuglog(statement) { def logL = 0 if (logLevel) logL = logLevel.toInteger() if (logL == 0) {return}//bail else if (logL >= 2) { log.debug(statement) } } def infolog(statement) { def logL = 0 if (logLevel) logL = logLevel.toInteger() if (logL == 0) {return}//bail else if (logL >= 1) { log.info(statement) } } def getLogLevels(){ return [["0":"None"],["1":"Running"],["2":"NeedHelp"]] } def version(){ unschedule() schedule("0 0 8 ? * FRI *", updateCheck) // Cron schedule - How often to perform the update check - (This example is 8am every Friday) updateCheck() } def updateCheck(){ setVersion() def paramsUD = [uri: "http://someDomain.com/versions.json" ] // This is the URI & path to your hosted JSON file try { httpGet(paramsUD) { respUD -> // log.warn " Version Checking - Response Data: ${respUD.data}" // Troubleshooting Debug Code - Uncommenting this line should show the JSON response from your webserver def copyrightRead = (respUD.data.copyright) state.Copyright = copyrightRead def newVerRaw = (respUD.data.versions.Driver.(state.InternalName)) def newVer = (respUD.data.versions.Driver.(state.InternalName).replace(".", "")) def currentVer = state.Version.replace(".", "") state.UpdateInfo = (respUD.data.versions.UpdateInfo.Driver.(state.InternalName)) state.author = (respUD.data.author) if(newVer == "NLS"){ state.Status = "** This driver is no longer supported by $state.author **" log.warn "** This driver is no longer supported by $state.author **" } else if(currentVer < newVer){ state.Status = "New Version Available (Version: $newVerRaw)" log.warn "** There is a newer version of this driver available (Version: $newVerRaw) **" log.warn "** $state.UpdateInfo **" } else{ state.Status = "Current" log.info "You are using the current version of this driver" } } } catch (e) { log.error "Something went wrong: CHECK THE JSON FILE AND IT'S URI - $e" } if(state.Status == "Current"){ state.UpdateInfo = "N/A" sendEvent(name: "DriverUpdate", value: state.UpdateInfo, isStateChange: true) sendEvent(name: "DriverStatus", value: state.Status, isStateChange: true) } else{ sendEvent(name: "DriverUpdate", value: state.UpdateInfo, isStateChange: true) sendEvent(name: "DriverStatus", value: state.Status, isStateChange: true) } sendEvent(name: "DriverAuthor", value: state.author, isStateChange: true) sendEvent(name: "DriverVersion", value: state.Version, isStateChange: true) // } def setVersion(){ state.Version = "1.0.2" // Version number of this driver state.InternalName = "TstatTrackerTile" // this is the name used in the JSON file for this driver }