Tiles missing in classic app under things

Went through my handlers that were affected. I am not using enum anywhere.

Yes it’s geared towards improving the the DTH loading performance

1 Like

Post your preferences section be happy to look at them. Are you using maps anywhere in your code?

Thanks RBoy …

preferences {
    	section ("Labels") {
            input("lblPush1", "text", title: "Label for Button 1 Push?", required: true, displayDuringSetup: true, defaultValue: "Push 1", description: "Label for the first push button.")  
            input("lblHold1", "text", title: "Label for Button 1 Hold?", required: true, displayDuringSetup: true, defaultValue: "Hold 1", description: "Label for the first hold button.")  
            input("lblPush2", "text", title: "Label for Button 2 Push?", required: true, displayDuringSetup: true, defaultValue: "Push 2", description: "Label for the second push button.")  
            input("lblHold2", "text", title: "Label for Button 2 Hold?", required: true, displayDuringSetup: true, defaultValue: "Hold 2", description: "Label for the second hold button.")  
            input("lblPush3", "text", title: "Label for Button 3 Push?", required: true, displayDuringSetup: true, defaultValue: "Push 3", description: "Label for the third push button.")  
            input("lblHold3", "text", title: "Label for Button 3 Hold?", required: true, displayDuringSetup: true, defaultValue: "Hold 3", description: "Label for the third hold button.")  
            input("lblPush4", "text", title: "Label for Button 4 Push?", required: true, displayDuringSetup: true, defaultValue: "Push 4", description: "Label for the fourth push button.")  
            input("lblHold4", "text", title: "Label for Button 4 Hold?", required: true, displayDuringSetup: true, defaultValue: "Hold 4", description: "Label for the fourth hold button.")  
        }
    }

On this I have to admit ignorance. How do I identify if maps are being used? My DTH was built from another, not from scratch so I can’t profess to understand all the code.

If it’s github code you can point to the repo otherwise look for things like in my previous post:

Small handler so posting complete code below. I do see what you mean by maps now. I’ll look too. Wondering if it’s this: (held ? "held" : "pushed")

BTW, I know I have labels set on the tiles and prefs for the same. Basically the prefs are not used. I had an issue getting the labels to stick from prefs based on the way I am using tiles.

/*
 *
 *  Modified by: Nezmo
 *  Modified and extended from SmartThings Kyse Aeon Minimote Device Handler Template.
 *  Changed to move away from using a list to display buttons.
 *
 *  Copyright 2015 SmartThings
 *
 *  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: "Nezmo's Aeon Minimote (xxxxxxx's Bedroom)", namespace: "Nezmo68", author: "Nezmo") {
		capability "Actuator"
		capability "Button"
		capability "Configuration"
		capability "Sensor"
        
		attribute "numButtons", "STRING"
        
        // Virtual Button Attributes for defining button labels.
        attribute "lblPush1", "STRING"
        attribute "lblHold1", "STRING"
        attribute "lblPush2", "STRING"
        attribute "lblHold2", "STRING"
        attribute "lblPush3", "STRING"
        attribute "lblHold3", "STRING"
        attribute "lblPush4", "STRING"
        attribute "lblHold4", "STRING"
        
		command "pushed"
        command "held"
        command "pushed", [int]
        command "held", [int]
        command "push1"
        command "hold1"
        command "push2"
        command "hold2"
        command "push3"
        command "hold3"
        command "push4"
        command "hold4"

		fingerprint deviceId: "0x0101", inClusters: "0x86,0x72,0x70,0x9B", outClusters: "0x26,0x2B"
		fingerprint deviceId: "0x0101", inClusters: "0x86,0x72,0x70,0x9B,0x85,0x84", outClusters: "0x26" // old style with numbered buttons
	}

	simulator {
		status "pushed 1":  "command: 2001, payload: 01"
		status "held 1":  "command: 2001, payload: 15"
		status "pushed 2":  "command: 2001, payload: 29"
		status "held 2":  "command: 2001, payload: 3D"
		status "pushed 3":  "command: 2001, payload: 51"
		status "held 3":  "command: 2001, payload: 65"
		status "pushed 4":  "command: 2001, payload: 79"
		status "held 4":  "command: 2001, payload: 8D"
		status "wakeup":  "command: 8407, payload: "
	}
    
    preferences {
    	section ("Labels") {
            input("lblPush1", "text", title: "Label for Button 1 Push?", required: true, displayDuringSetup: true, defaultValue: "Push 1", description: "Label for the first push button.")  
            input("lblHold1", "text", title: "Label for Button 1 Hold?", required: true, displayDuringSetup: true, defaultValue: "Hold 1", description: "Label for the first hold button.")  
            input("lblPush2", "text", title: "Label for Button 2 Push?", required: true, displayDuringSetup: true, defaultValue: "Push 2", description: "Label for the second push button.")  
            input("lblHold2", "text", title: "Label for Button 2 Hold?", required: true, displayDuringSetup: true, defaultValue: "Hold 2", description: "Label for the second hold button.")  
            input("lblPush3", "text", title: "Label for Button 3 Push?", required: true, displayDuringSetup: true, defaultValue: "Push 3", description: "Label for the third push button.")  
            input("lblHold3", "text", title: "Label for Button 3 Hold?", required: true, displayDuringSetup: true, defaultValue: "Hold 3", description: "Label for the third hold button.")  
            input("lblPush4", "text", title: "Label for Button 4 Push?", required: true, displayDuringSetup: true, defaultValue: "Push 4", description: "Label for the fourth push button.")  
            input("lblHold4", "text", title: "Label for Button 4 Hold?", required: true, displayDuringSetup: true, defaultValue: "Hold 4", description: "Label for the fourth hold button.")  
        }
    }

	tiles (scale: 2) { 
            standardTile("Push", "device.button", width: 2, height: 4) {
            	state("default", label: "Push", defaultState: true, backgroundColor: "#ffffff", icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Minimote-narrow.png", canChangeIcon: true, canChangeBackground: true)
            }
            standardTile("Push 1", "device.lblPush${1}", width: 2, height: 2, decoration: "flat") { 
            	state("default", label: 'Main Light', action: "push${1}", defaultState: true, icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Button-1.png", canChangeBackground: true)
            }
            standardTile("Push 2", "device.lblPush${2}", width: 2, height: 2, decoration: "flat") {
            	state("default", label: 'Fan', action: "push${2}", defaultState: true, icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Button-2.png", canChangeBackground: true) 
            }
            standardTile("Push 3", "device.lblPush${3}", width: 2, height: 2, decoration: "flat") {
				state("default", label: 'Bedside Lamp', action: "push${3}", defaultState: true, icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Button-3.png", canChangeBackground: true)
            }
            standardTile("Push 4", "device.lblPush${4}", width: 2, height: 2, decoration: "flat") {
            	state("default", label: 'Sink Light', action: "push${4}", defaultState: true, icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Button-4.png", canChangeBackground: true) 
            }
            standardTile("Hold" ,"device.button", width: 2, height: 4) {
            	state("default", label: "Hold", defaultState: true, backgroundColor: "#ffffff", icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Minimote-narrow.png", canChangeIcon: true, canChangeBackground: true)
            }
            standardTile("Hold 1", "device.lblHold${1}", width: 2, height: 2, decoration: "flat") {
				state("default", label: 'Closet Light', action: "hold${1}", defaultState: true, icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Button-1.png", canChangeBackground: true)
            }
            standardTile("Hold 2", "device.lblHold${2}", width: 2, height: 2, decoration: "flat") {
            	state("default", label: '', action: "hold${2}", defaultState: true, icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Button-2.png", canChangeBackground: true) 
            }
            standardTile("Hold 3", "device.lblHold${3}", width: 2, height: 2, decoration: "flat") {
				state("default", label: '', action: "hold${3}", defaultState: true, icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Button-3.png", canChangeBackground: true)
            }
            standardTile("Hold 4", "device.lblHold${4}", width: 2, height: 2, decoration: "flat") {
            	state("default", label: 'Bathroom Light', action: "hold${4}", defaultState: true, icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Button-4.png", canChangeBackground: true)
            }
        	standardTile("configure", "device.configure", inactiveLabel: false, decoration: "flat") {
      		state "configure", label: '', action:"configuration.configure", icon:"st.secondary.configure"
        	}
	}
}

def installed() {
initLabels()
}

def updated() {
	initLabels()
}

def initLabels() {
    (1..4).each { button ->
    	["Push","Hold"].each { action ->
           	def descriptionText = "Updating button ${button} ${action}"
            def settingName = "lbl${action}${button}"
            log.debug descriptionText + ": ${settings[settingName]}"
			sendEvent(name: "lbl${action}${button}", value: "${settings[settingName]}", descriptionText: descriptionText, isStateChange: true, displayed: false)
		}
    }
}

def parse(String description) {
	def results = []
	if (description.startsWith("Err")) {
	    results = createEvent(descriptionText:description, displayed:true)
	} else {
		def cmd = zwave.parse(description, [0x2B: 1, 0x80: 1, 0x84: 1])
    	if(cmd) results += zwaveEvent(cmd)
		if(!results) results = [ descriptionText: cmd, displayed: false ]
	}
	//log.debug("Parsed '$description' to $results")
	return results
}

def zwaveEvent(physicalgraph.zwave.commands.wakeupv1.WakeUpNotification cmd) {
	def results = [createEvent(descriptionText: "$device.displayName woke up", isStateChange: false)]
    
    results += configurationCmds().collect{ response(it) }
	results << response(zwave.wakeUpV1.wakeUpNoMoreInformation().format())

	return results
}

def buttonEvent(button, held) {
	// Leaving value as pushed or held to stay compatible with Button Controller Smart App for now.
	button = button as Integer
	if (held) {
		createEvent(name: "button", value: "held", data: [buttonNumber: button, action: (held ? "held" : "pushed")], source: "DEVICE", descriptionText: "$device.displayName button $button was held", isStateChange: true)
	} else {
		createEvent(name: "button", value: "pushed", data: [buttonNumber: button, action: (held ? "held" : "pushed")], source: "DEVICE", descriptionText: "$device.displayName button $button was pushed", isStateChange: true)
	}
}

def zwaveEvent(physicalgraph.zwave.commands.sceneactivationv1.SceneActivationSet cmd) {
	Integer button = ((cmd.sceneId + 1) / 2) as Integer
	Boolean held = !(cmd.sceneId % 2)
	buttonEvent(button, held)
}

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd) {
	Integer button = (cmd.value / 40 + 1) as Integer
	Boolean held = (button * 40 - cmd.value) <= 20
	buttonEvent(button, held)
}

def zwaveEvent(physicalgraph.zwave.Command cmd) {
	[ descriptionText: "$device.displayName: $cmd", linkText:device.displayName, displayed: false ]
}

def configurationCmds() {
	def cmds = []
	def hubId = zwaveHubNodeId
	(1..4).each { button ->
		cmds << zwave.configurationV1.configurationSet(parameterNumber: 240+button, scaledConfigurationValue: 1).format()
	}
	(1..4).each { button ->
		cmds << zwave.configurationV1.configurationSet(parameterNumber: (button-1)*40, configurationValue: [hubId, (button-1)*40 + 1, 0, 0]).format()
		cmds << zwave.configurationV1.configurationSet(parameterNumber: (button-1)*40 + 20, configurationValue: [hubId, (button-1)*40 + 21, 0, 0]).format()
	}
	cmds
}

def configure() {
	// Set the number of buttons to 4
	sendEvent(name: "numButtons", value: "4", displayed: false)

	def cmds = configurationCmds()
	//log.debug("Sending configuration: $cmds")
	return cmds
}

def push1() {
	pushed(1)
}

def push2() {
	pushed(2)
}

def push3() {
	pushed(3)
}

def push4() {
	pushed(4)
}

def pushed(button) {
	sendEvent(name: "button", value: "pushed", data: [buttonNumber: button, action: "pushed"], source: "COMMAND", descriptionText: "$device.displayName button $button was pushed", isStateChange: true)
}

def hold1() {
	held(1)
}

def hold2() {
	held(2)
}

def hold3() {
	held(3)
}

def hold4() {
	held(4)
}

def held(button) {
    sendEvent(name: "button", value: "held", data: [buttonNumber: button, action: "held"], source: "COMMAND", descriptionText: "$device.displayName button $button was held", isStateChange: true)
}

Hi. I am new to smartthings, so do not follow some of the technical advice here. I noticed that a few of my devices are missing tiles on the mobile app on android but present in the IDE. Seems to have happened today. This includes my sonos players, a Sensative strip door opener and 2 Monoprice outlets. My Schlage Locks and Nest which have custom DTHs seem to be fine. There are no associated DTHs that I can see with the devices with the missing tiles in the IDE. Read another post and tried to edit and update the devices in the IDE but get an internal error. Am able to edit and update devices which have visible tiles. Tried rebooting the hub but with no luck. Appreciate any guidance of how to fix.

While looking for a solution, this seems to have worked so far for me. I went to the IDE, clicked on the device, then edit and changed the type for the devices with missing tiles and now am able to see them. Not sure why they had to be changed in the first place if they were working. Maybe someone can explain

-Changed Sonos to Sonos Player
-Changed Monoprice switches to standardDeviceTile
-Changed Sensative strip to Zwave Plus Door/Window Sensor

Hoping this will continue to work.

ST is making a few changes, lets wait till the new parser goes live and we’ll relook at it.

1 Like

The functionality that originally caused these issues has been turned back on after resolving the edge cases that caused issues for DTHs in this thread. Let me know if you are still experiencing issues.

1 Like

Luke, in my case everything appears to be okay.

Thanks.

1 Like

Luke it appears to be working but I’m not seeing any difference in the speed of loading the Things page or the individual device pages on iOS

That’s not terribly surprising, the primary focus of this change was to minimize the amount of stop the world GC pausing. There might be some follow up work with might help improve the consistency of fast responses, but in general average latency isn’t the focus here.

1 Like

mine went down this morining
def rates = [:]
rates << [“5” : “Refresh every 5 minutes (eTRVs)”]
rates << [“10” : “Refresh every 10 minutes (power monitors)”]
rates << [“15” : “Refresh every 15 minutes (sockets)”]
rates << [“30” : “Refresh every 30 minutes (default)”]
rates << [“No” : “Manual Refresh - Default (Sockets)”]

preferences {
    input name: "refreshRate", type: "enum", title: "Refresh Rate", options: rates, description: "Select Refresh Rate", required: false
	input "checkinInfo", "enum", title: "Show last Check-in info", options: ["Hide", "MM/dd/yyyy h:mma", "h:mma dd/mm/yyyy", "dd/MM/yyyy h:mm", "dd-MM-yyyy HH:mm" , "h:mma dd/MM/yy"], description: "Show last check-in info.", required: false
    input name: "emergencyheattemp", 	type: "number", title: "Temp to boost to - 13 to 30", range: "13..30", description: "Boost aka cool to temp", required: false
    input description: "Summer mode ---  \nOpens the valve fully & prevents any other change to state without press the auto putton", title: "Summer Button", displayDuringSetup: false, type: "paragraph", element: "paragraph"
   	input description: "---Turn On---  \n'OK google set **device name/room** termostat(s) to heat/cool' \nheat=Resume \ncool=boost \n---Turn Off--- \n'Ok google turn off **device name/room** thermostat(s)' \nSaves the last settings and turns off (aka 12deg) \n---Set Temprature--- \n'Ok google set **device name/room** thermostat(s)/temprature to **number** \n---Quiry Temprature--- \n'Ok google what is the temprature in the **device name/room/house**' \nResponse current temp and setpoint \n---Boost--- \n'Ok google set **device name/room** thermostat(s) to COOL \naka boost to temp & time set above", title: "Google Guide", displayDuringSetup: false, type: "paragraph", element: "paragraph"
}

got mine working (ish), but i still get the red “sorry but there was an unexpected error”
input name: “refreshRate”, type: “enum”, title: “Refresh Rate”, options: [“5” : “Refresh every 5 minutes (eTRVs)”, “10” : “Refresh every 10 minutes (power monitors)”, “15” : “Refresh every 15 minutes (sockets)”, “30” : “Refresh every 30 minutes (default)”, “No” : “Manual Refresh - Default (Sockets)”], description: “Select Refresh Rate”, required: false

Any ideas?

seams to be working now, ive taken out the maps and bracked () every attribute state and take away [()] from the main

edit, it seams to be hit and miss, working 1 min then not the next!

tiles(scale: 2) {
	multiAttributeTile(name: "thermostat", type: "generic", width: 6, height: 4, canChangeIcon: true) {  
		tileAttribute("device.temperature", key:"PRIMARY_CONTROL") {
			attributeState("thermostat", label: '${currentValue}°', unit:"C", icon: "st.Weather.weather2", //canChangeIcon: true,
            backgroundColors:[
				[value: 0, color: "#153591"],
				[value: 10, color: "#1e9cbb"],
				[value: 13, color: "#90d2a7"],
				[value: 17, color: "#44b621"],
				[value: 20, color: "#f1d801"],
				[value: 25, color: "#d04e00"],
				[value: 29, color: "#bc2323"],
                [value: offline, color: "#ff0000"]
			]
            )
		}

      tileAttribute("device.lastCheckin", key: "SECONDARY_CONTROL") {
           	attributeState("default", label:'${currentValue}')
       	}
	}
    

    valueTile("heatingSetpoint", "device.heatingSetpoint", width: 2, height: 2) {
		state ("default", label:'${currentValue}°', unit:"C", backgroundColors:[
				[value: 0, color: "#153591"],
				[value: 10, color: "#1e9cbb"],
				[value: 13, color: "#90d2a7"],
				[value: 17, color: "#44b621"],
				[value: 20, color: "#f1d801"],
				[value: 25, color: "#d04e00"],
				[value: 29, color: "#bc2323"]
			]
            )
	}
    
    standardTile("refresh", "device.refresh", inactiveLabel: false, decoration: "flat", width: 1, height: 1) {
		state ("default", label:'refresh', action:"refresh", icon:"st.secondary.refresh-icon")
	}

	 standardTile("summer", "device.summer", inactiveLabel: false, decoration: "flat", width: 1, height: 1) {
		state ("auto", label:'Summer', action: "summer", icon:"st.thermostat.auto")
        state ("summer", label:'Deactivite', action: "heat", icon:"st.custom.wuk.clear")
	}
    controlTile("heatSliderControl", "device.heatingSetpoint", "slider", height: 2, width: 2, inactiveLabel: false, range:"(12..30)") {
		state ("setHeatingSetpoint", action:"setHeatingSetpoint") //need to send to a lag
	}
    
    valueTile("battery", "device.batteryVoltage", width: 2, height: 2) {
		state ("default", label:'Battery Voltage Is ${currentValue}', unit:"V", backgroundColors:[
           					[value: 3, color: "#44b621"],
							[value: 2.8, color: "#f1d801"],
							[value: 2.78, color: "#bc2323"],
     		           ]
                       )
    }
    controlTile("boostSliderControl", "device.boostLength", "slider", height: 2, width: 2, inactiveLabel: false, range:"(30..120)") {
		state ("setBoostLength", label:'Set boost length to', action:"setBoostLength")
	}
            
    standardTile("boostSwitch", "device.boostSwitch", decoration: "flat", height: 2, width: 2, inactiveLabel: false) {
		state ("stby", label:'Press to boost', action: "emergencyHeat", icon:"st.alarm.temperature.overheat")
        state ("emergencyHeat", label: 'Press Reboost', action:"emergencyHeat", icon:"st.Health & Wellness.health7", backgroundColor: "#bc2323")
		
    }
     standardTile("thermostatMode", "device.thermostatMode", inactiveLabel: false, decoration: "flat", width: 2, height: 2) {

// google does not recognise //state (“auto”, label: ‘auto Press for off’, action:“off” , icon:“st.thermostat.auto-cool”)
state (“heat”, label: ‘Press for Off’, action:“off” , icon:“st.thermostat.heat-auto”, backgroundColor:"#00a0dc")
state (“cool”, label: ‘In BOOST Press for Resume’, action:“stopBoost”, icon:“st.thermostat.emergency-heat”, backgroundColor:"#e86d13")
state (“off”, label: ‘Press for Heat (or press boost below)’, action:“heat”, icon:“st.thermostat.heating-cooling-off”)
state (“summer”, label: ‘Valve full open Turn off below’, icon:“st.custom.wuk.clear”)
}

    valueTile("boostLabel", "device.boostLabel", inactiveLabel: true, decoration: "flat", width: 4, height: 1) {
		state ("default", label:'${currentValue}')
    }
	
    main "thermostat"
	details(["thermostat", "heatingSetpoint", "heatSliderControl", "thermostatMode", "boostLabel", "battery", "boostSliderControl", "boostSwitch", "refresh", "summer"])
}

Could you DM your SmartThings username and the respective DTH? :slightly_smiling_face:

Ive completely lost my favourites, things page and can only access devices in ‘rooms’ where there are no etrv’s

Working now thanks luke

1 Like