metadata { definition( name: "Solcast_dual", namespace: "alan_f", author: "Alan F", importUrl: "https://raw.githubusercontent.com/youzer-name/Solcast_dual/main/solcast.groovy", ) { capability "Refresh" capability "EnergyMeter" capability "PowerMeter" attribute "energy", "number" attribute "power", "number" attribute "24 Hour Peak Production_a", "number" attribute "24 Hour Peak Production_b", "number" attribute "48 Hour Peak Production_a", "number" attribute "48 Hour Peak Production_b", "number" attribute "72 Hour Peak Production_a", "number" attribute "72 Hour Peak Production_b", "number" attribute "1 Hour Estimate_a", "number" attribute "1 Hour Estimate_b", "number" attribute "1 Hour Estimate", "number" attribute "one_hour_estimate", "number" attribute "24 Hour Estimate", "number" attribute "24 Hour Estimate - High", "number" attribute "24 Hour Estimate - Low", "number" attribute "48 Hour Estimate", "number" attribute "48 Hour Estimate - High", "number" attribute "48 Hour Estimate - Low", "number" attribute "72 Hour Estimate", "number" attribute "72 Hour Estimate - High", "number" attribute "72 Hour Estimate - Low", "number" attribute "lastUpdate", "string" attribute "html24hour", "string" } preferences { input name: "logEnable", type: "bool", title: "Enable Info logging", defaultValue: true, description: "" input name: "debugLog", type: "bool", title: "Enable Debug logging", defaultValue: false, description: "" input name: "htmlTile", type: "bool", title: "Create Dashboard Tile?", defaultValue: false, description: "" input name: "api_key", type: "string", title: "API Key", required: true input name: "resource_id_a", type: "string", title: "Site Resource ID_a", required: true input name: "resource_id_b", type: "string", title: "Site Resource ID_b", required: true input("refresh_interval", "enum", title: "How often to refresh the forecast data", options: [ 0: "Do NOT update", 30: "30 minutes", 1: "1 Hour", 3: "3 Hours", 8: "8 Hours", 12: "12 Hours", 24: "Daily", ], required: true, defaultValue: "0") input name: "refreshhour", type: "enum", title: "Refresh time (hour)", defaultValue: 0, description: "Only applies to Daily interval", options:["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23"] input name: "refreshminute", type: "enum", title: "Refresh time (minute)", defaultValue: 0, options:["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59"] input name: "randomize", type: "bool", title: "Randomize seconds?", defaultValue: true, description: "Perform refresh random seconds after selected hour:minute" } } def version() { return "1.0.3" //1.0.2 - add settable refresh time and random seconds option //1.0.3 - fix typo in next1_b calculation, add delay between API calls } def installed() { if (logEnable) log.info "Driver installed" state.version = version() } def uninstalled() { unschedule(refresh) if (logEnable) log.info "Driver uninstalled" } def updated() { if (logEnable) log.info "Settings updated" if (settings.refresh_interval != "0") { //refresh() def refreshseconds = 0 if (settings.randomize) { refreshseconds = Math.abs(new Random().nextInt() % 59) +1 } if (settings.refresh_interval == "24") { schedule("${refreshseconds} ${settings.refreshminute} ${settings.refreshhour} ? * * *", refresh, [overwrite: true]) } else if(settings.refresh_interval == "30"){ schedule("${refreshseconds} */30 * ? * *", refresh, [overwrite: true]) } else { schedule("${refreshseconds} ${refreshminute} */${settings.refresh_interval} ? * * *", refresh, [overwrite: true]) } }else{ unschedule(refresh) } state.version = version() } import groovy.json.JsonOutput; def refresh() { outputTZ = TimeZone.getTimeZone('UTC') def next1 = 0; def next24 = 0; def next24High = 0; def next24Low = 0; def next48 = 0; def next48High = 0; def next48Low = 0; def next72 = 0; def next72High = 0; def next72Low = 0; host = "https://api.solcast.com.au/rooftop_sites/${resource_id_a}/forecasts?format=json&api_key=${api_key}&hours=72" if(debugLog) log.debug host forecasts = httpGet([uri: host]) {resp -> def respData = resp.data.forecasts} //if(debugLog) log.debug JsonOutput.toJson(forecasts) def next1_a = 0; def next24_a = 0; def next24High_a = 0; def next24Low_a = 0; def next48_a = 0; def next48High_a = 0; def next48Low_a = 0; def next72_a = 0; def next72High_a = 0; def next72Low_a = 0; def size = forecasts.size(); for(int x=0; x def respData = resp.data.forecasts} //if(debugLog) log.debug JsonOutput.toJson(forecasts) def next1_b = 0; def next24_b = 0; def next24High_b = 0; def next24Low_b = 0; def next48_b = 0; def next48High_b = 0; def next48Low_b = 0; def next72_b = 0; def next72High_b = 0; def next72Low_b = 0; size = forecasts.size(); for(int x=0; x