Improved UI for Aeon Minimote

Since I’m dependent on text to speech, I can’t read the code. Has anyone checked this DTH to see if it was updated for the number of buttons field change?

JD, since copying down the code I have just been using my version which is working fine. I can’t, therefore, comment on how the original code is but I am sure it’s fine.

Note, this is just the DTH that simulates the Minimote in the ST app. To define the actual functions for each button press/hold Kyse has a SmartApp …

I am using this one very slightly modified and it works.

2 Likes

@Kyse
Where are you? Bat signal, we need your help

What do you need? Pretty busy atm with work sadly.

1 Like

I know you’re busy. If you have time I’d appreciate any insight. But if you don’t have time, totally understand!!

How do you modify this DH slightly to display tiles individually rather than as a populating (list 1-4)

Meaning in display, one could display the tiles in order 1-8 without the first vertical column.

I can mod display orders, colors and labels on my own, I’ve just never worked with a DH that puts them as

Button ( ) press
Button ( ) held
There it populates like you have it from a list. See my post above.

Forget about all the stuff in this post about importing status of SHM, or non related tiles. I’ve got that covered. I just need to know how to list all the buttons individually rather than list populateing the tiles

Honestly, I learned everything I did from examples or documentation. I’d imagine they have a documentation somewhere related to layouts. I’d start by trying to research that. Last time I looked at it you were limited on what kind of layouts you could add, so I just made do with what was available. Perhaps things have changed, so probably worth your time to look into design layouts.

1 Like

I think I can probably handle this. I’ve been giving some thought on doing something similar as it may actually solve some issues I’ve had with other mods to this DH.

I can’t promise anything quick but if I do it I will post back.

1 Like

Okay, this version moves away from using a list to display the buttons so each tile is defined individually. I still have the first column displayed but hopefully you can take what you want from this.

Caveat: I am not a developer so I could well have made gaffs however it seems to be working for me.

/*
 *
 *  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", 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("Button 1", "device.button", width: 2, height: 2) {
            	state("default", label: "Button 1", defaultState: true, backgroundColor: "#ffffff", icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Minimote.png", canChangeIcon: true, canChangeBackground: true)
            }
            valueTile("Push 1", "device.lblPush${1}", width: 2, height: 2, decoration: "flat") {
				state("default", label: '${currentValue}', action: "push${1}", defaultState: true, backgroundColor: "#33cc33", canChangeBackground: true)
            }
            valueTile("Hold 1", "device.lblHold${1}", width: 2, height: 2, decoration: "flat") {
            	state("default", label: '${currentValue}', action: "hold${1}", defaultState: true, backgroundColor: "#00a0dc", canChangeBackground: true) 
            }
            standardTile("Button 2", "device.button", width: 2, height: 2) {
            	state("default", label: "Button 2", defaultState: true, backgroundColor: "#ffffff", icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Minimote.png", canChangeIcon: true, canChangeBackground: true)
            }
            valueTile("Push 2", "device.lblPush${2}", width: 2, height: 2, decoration: "flat") {
				state("default", label: '${currentValue}', action: "push${2}", defaultState: true, backgroundColor: "#33cc33", canChangeBackground: true)
            }
            valueTile("Held 2", "device.lblHold${2}", width: 2, height: 2, decoration: "flat") {
            	state("default", label: '${currentValue}', action: "hold${2}", defaultState: true, backgroundColor: "#00a0dc", canChangeBackground: true) 
            }
            standardTile("Button 3" ,"device.button", width: 2, height: 2) {
            	state("default", label: "Button 3", defaultState: true, backgroundColor: "#ffffff", icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Minimote.png", canChangeIcon: true, canChangeBackground: true)
            }
            valueTile("Push 3", "device.lblPush${3}", width: 2, height: 2, decoration: "flat") {
				state("default", label: '${currentValue}', action: "push${3}", defaultState: true, backgroundColor: "#33cc33", canChangeBackground: true)
            }
            valueTile("Held 3", "device.lblHold${3}", width: 2, height: 2, decoration: "flat") {
            	state("default", label: '${currentValue}', action: "hold${3}", defaultState: true, backgroundColor: "#00a0dc", canChangeBackground: true) 
            }
            standardTile("Button 4", "device.button", width: 2, height: 2) {
            	state("default", label: "Button 4", defaultState: true, backgroundColor: "#ffffff", icon: "https://raw.githubusercontent.com/Nezmo68/SmartThingsPublic/master/Minimote.png", canChangeIcon: true, canChangeBackground: true)
            }
            valueTile("Push 4", "device.lblPush${4}", width: 2, height: 2, decoration: "flat") {
				state("default", label: '${currentValue}', action: "push${4}", defaultState: true, backgroundColor: "#33cc33", canChangeBackground: true)
            }
            valueTile("Held 4", "device.lblHold${4}", width: 2, height: 2, decoration: "flat") {
            	state("default", label: '${currentValue}', action: "hold${4}", defaultState: true, backgroundColor: "#00a0dc", 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)
}
1 Like

I’ll play with it tonight!! You’re the man!

1 Like

Can you provide screenshots?

The code I posted above produces this … it’s no different from the prior versions (other than showing some differences due to issues with rendering in iOS). All I did was change how the buttons are coded.

Since that post I have been playing some more and currently have this … still tweaking.

2 Likes

@nezmo looking good. played with it last night! Works flawlessly.
Only thing I’d love to add (obviously custom not for general minimote handler is the location mode (HUB not SHM) status on a value tile. like this:


This is custom based off pressed buttons, not the {$currentvalue} for capibility.locationmode

Any ideas?

Okay, you want the ability to change mode or just display it?

the buttons are set with a webcore piston to set the mode already.
I just want a top value tile to diaplay it.

Got it. I’ll have a crack at it this evening.

1 Like

I’ve got this working now. Give me a little more time to clean things up and I’ll post back.

1 Like

Okay, I’ve made two versions. Each have trade offs. Let me know what you think.

Option 1

The mode will not show on the list view unless I put it in the center of the large tile which just overlays the icon and looks messy. I could redo the icon to fix that.

Option 2

At the moment I can’t find a way to display the mode as a value tile without it messing up what you see on the list of Things. I can add as a value tile without that problem if I add it as anything but the top row. Example.

With this method you won’t see the current mode on the list view either.

EDIT: Updating to include link to the code for above.

Minimotes have stopped working for me using this DTH.

Edit: After pushing a tile button in the Classic App, the physical button is now working again. Have to check my others.

Does this DTH even work in the new app?

1 Like

Nope. What’s the alternative?