I have two, the family one is programmed the same for push and hold buttons for simplicity. The key layout is in relationship to the location of the room lights and is Velcroed to my oak trim. The other one is bedside and I have 8 functions programmed, including dim on push and full on hold.
BTW- the first battery recharge lasted about 2-1/2 months. I have v1 with software update.
The only thing I have is under the slide out (bottom side) is a number for which minimote it is. 1 is in the living room, 2 is in the bedroom, just in case I move them around.
I did that with a sharpie
I just print out a small 1" x 2" label like below using Arial Narrow font, then I cut out a piece of clear packing tape and stick the label to the bottom part of the minimote. It just fits. Maybe not that pretty looking but it works for me.
I liked @Jimxenus method for the minimote itself. I used his technique in Word to define larger numbers and like @daven bolded the push action. I then added the light gray lines between the buttons for clarity. I just used scotch tape on the sides and over the front for mild protection from dirt and fingerprints.
But I also changed out my device type to @Kyseimproved UI for Aeon Minimote so that I get the equivalent labeling capability on my smart phone app. I don’t have to guess what button does what with the Minimote.
You get to label both the green “PRESS” as well as the blue “HOLD” functions.
Note, you will need to change the labels for your buttons in lines 85 though 110. While you can set the labels in prefs, there is a limitation in the code and the labels get lost after you tap a button thus the need for hard-coding them.
/*
*
* 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 (Family Room)", 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: 'Lamp', 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: 'Entryway Lamps', 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: "Fan", 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: "Kitchen Bar", 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: 'Landing Lights', 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: 'Kitchen Sink', 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)
}