No door icon?

Is it true that there is no icon of a door in the default SmartThings icons list? I see a teapot, a plunger, 8 different beds, and a soccer ball… and I see a window… but I don’t see a door.

Hmm… ?

See http://scripts.3dgo.net/smartthings/icons/

“locks” has doors with keys/locks, otherwise they use the funky |> <| symbols to show open/shut door/window

Wow you’re correct, I had to take a look to check because I would have sworn there was one. It appears on the doors and locks which is odd.

Use the coffin… :stuck_out_tongue_closed_eyes:

@schettj There’s no way to use those icons unless I build a custom device type right? I was kinda hoping to avoid having a bunch of custom devices, but I’ll do that if I have to.

Here is an article on how to add add custom icons to any device type . . . if there is demand for it i will make several door icons and upload them here ot be saved and used with the custom icon hack . . . just let me know :slight_smile:

However yes i agree there should be a generic DOOR ICON as standard, for instance on doors you have open close sensors on etc . . . maybe we could get together a list of icons we would all like to have added, and the top 50 say get made and added in . . .

kyle

Blah… yeah I know I can modify the device types… I probably have 20 device types in use now, and I don’t really want to go make copies of them all. But I might start doing that someday…

I’d vote for a few variations on Doors, a few more windows (with and without window dressings), a non-festive single bell option (using the christmas bells for my doorbell now). I’m sure I’ll think of more. And maybe I’ll even make a few myself :smile:

I really just want to know what the automated use case for the Plunger icon is.

I just grouped all inside doors into their own group, and all outside doors into their own group. The icons are less bothersome that way.

Besides I try not to look at the app much. The awfulness. It burns. :smile:

You dont need to make copies of all device types, infact its very wuick to do, i did 5 in as many minutes (excluding the time to actually make the custom icons)

Kyle

@NorCalLights and @AutomateEverything, you don’t need to create a new device type for each one at all, AND once you change the device to an icon you like you can go back to using ST’s default device type and not lose your changes. I’ve done that for over 70 switches and outlets.

I have a very simple custom device type that all it does is give me the ability to change the icon, and after I change it I go back to “Z-Wave Switch”, or what ever it needs to be. For some reason ST retains the icon.

https://github.com/constjs/SmartThings-Devices/blob/master/device_icon_modifier.device.groovy

2 Likes

Exactly same way i do it thats what i was getting at . . . So easy !!!

as you can see

1 Like

Ohhhhh! Now I see. So the icon sticks once you change it, regardless of the device type. Amazing. At least until it gets “fixed” :wink:
Y’all are the best.
~P

2 Likes

Hey @johnconstantelo will this work to change the icon of the device under the things tab? I’m hoping I can change the icon of my Aeon HEM (select from my photo library the same way we can change the icon of the mobile presence devices). Thanks

Hi @stewartad1,

This was designed for v1.x of the app where only icons were used instead of names, so I never tested this with app v2.x. I suppose it should still work.

Are using ST’s stock device type, or a custom one, and is your HEM v1 or v2? I use my own device type for the HEMv1, and it makes it look like this in the Things tab:

Device detail:

Source code for HEMv1:

https://raw.githubusercontent.com/constjs/SmartThings-Devices/master/aeon_hemv1_v3.device.groovy

@johnconstantelo

I ended up using drshaw’s device type, it seems to work better for IOS. I have the HEM v1. I was curious if we could change the icon on the things page to add a picture, like a picture of my electrical meter. Thanks

@stewartad1, lol, which he used mine to tweak to make work for iOS, and then I used his code for the min/max and kWh/Cost rest, as well as the configuration parameter updates. Lots of really good collaboration on that device type!

Both versions of that code contain “canChangeIcon: true”, so you can edit the device and have the “Update Icon” option available. I just tried with my device type and I was able to successfully update the icon:

Hmm, I must have grabbed a different version of drshaws code, it doesn’t have the canChangeIcon. Not sure how to paste code in the community with the line numbers so I hope this works out ok.

Somewhat off topic but the date on my upper left tile is wrong too (see screen shot).

Thanks again for all your help. I’m not experience at coding, I can dig around and debug some, tweak but I hope to get better.

Dave

/**

  • Aeon HEMv2
  • Copyright 2014 Barry A. Burke
  • 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.
  • Aeon Home Energy Meter v2 (US)
  • Author: Barry A. Burke
  • Contributors: Brock Haymond: UI updates
  • Genesys: Based off of Aeon Smart Meter Code sample provided by SmartThings (2013-05-30). Built on US model
  •       may also work on international versions (currently reports total values only)
    
  • History:
  • 2014-06-13: Massive OverHaul
  •          - Fixed Configuration (original had byte order of bitstrings backwards
    
  •          - Increased reporting frequency to 10s - note that values won't report unless they change
    
  •            (they will also report if they exceed limits defined in the settings - currently just using
    
  •            the defaults).
    
  •          - Added support for Volts & Amps monitoring (was only Power and Energy)
    
  •          - Added flexible tile display. Currently only used to show High and Low values since last
    
  •            reset (with time stamps). 
    
  •          - All tiles are attributes, so that their values are preserved when you're not 'watching' the
    
  •            meter display
    
  •          - Values are formatted to Strings in zwaveEvent parser so that we don't lose decimal values 
    
  •            in the tile label display conversion
    
  •          - Updated fingerprint to match Aeon Home Energy Monitor v2 deviceId & clusters
    
  •          - Added colors for Watts and Amps display
    
  •          - Changed time format to 24 hour
    
  • 2014-06-17: Tile Tweaks
  •          - Reworked "decorations:" - current values are no longer "flat"
    
  •          - Added colors to current Watts (0-18000) & Amps (0-150)
    
  •          - Changed all colors to use same blue-green-orange-red as standard ST temperature guages
    
  • 2014-06-18: Cost calculations
  •          - Added $/kWh preference
    
  • 2014-09-07: Bug fix & Cleanup
  •          - Fixed "Unexpected Error" on Refresh tile - (added Refresh Capability)
    
  •          - Cleaned up low values - reset to ridiculously high value instead of null
    
  •          - Added poll() command/capability (just does a refresh)
    
  • 2014-09-19 GUI Tweaks, HEM v1 alterations (from Brock Haymond)
  •          - Reworked all tiles for look, color, text formatting, & readability
    

*/
metadata {
// Automatically generated. Make future change here.
definition (
name: “Aeon HEMv1”,
namespace: “smartthings”,
category: “Green Living”,
author: “Barry A. Burke”
)
{
capability “Energy Meter”
capability “Power Meter”
capability “Configuration”
capability “Sensor”
capability “Refresh”
capability “Polling”
capability “Battery”

    attribute "energy", "string"
    attribute "power", "string"
    attribute "volts", "string"
    attribute "amps", "string"
    
    attribute "energyDisp", "string"
    attribute "energyOne", "string"
    attribute "energyTwo", "string"
    
    attribute "powerDisp", "string"
    attribute "powerOne", "string"
    attribute "powerTwo", "string"
    
    attribute "voltsDisp", "string"
    attribute "voltsOne", "string"
    attribute "voltsTwo", "string"
    
    attribute "ampsDisp", "string"
    attribute "ampsOne", "string"
    attribute "ampsTwo", "string"        
    
    command "reset"
    command "configure"
    
   fingerprint deviceId: "0x2101", inClusters: " 0x70,0x31,0x72,0x86,0x32,0x80,0x85,0x60"

// V2 fingerprint deviceId: “0x3101”, inClusters: “0x70,0x32,0x60,0x85,0x56,0x72,0x86”
}

// simulator metadata
simulator {
    for (int i = 0; i <= 10000; i += 1000) {
        status "power  ${i} W": new physicalgraph.zwave.Zwave().meterV1.meterReport(
            scaledMeterValue: i, precision: 3, meterType: 33, scale: 2, size: 4).incomingMessage()
    }
    for (int i = 0; i <= 100; i += 10) {
        status "energy  ${i} kWh": new physicalgraph.zwave.Zwave().meterV1.meterReport(
            scaledMeterValue: i, precision: 3, meterType: 33, scale: 0, size: 4).incomingMessage()
    }
    // TODO: Add data feeds for Volts and Amps
}

// tile definitions
tiles {

// Watts row

    valueTile("powerDisp", "device.powerDisp") {
        state (
            "default", 
            label:'${currentValue}', 
            foregroundColors:[
                [value: 1, color: "#000000"],
                [value: 10000, color: "#ffffff"]
            ], 
            foregroundColor: "#000000",
            backgroundColors:[
                [value: "0 Watts",      color: "#153591"],
                [value: "500 Watts",   color: "#1e9cbb"],
                [value: "1000 Watts",   color: "#90d2a7"],
                [value: "1500 Watts",   color: "#44b621"],
                [value: "2000 Watts",  color: "#f1d801"],
                [value: "2500 Watts",  color: "#d04e00"], 
                [value: "3000 Watts",  color: "#bc2323"] 
                /*
                [value: "0 Watts",      color: "#153591"],
                [value: "3000 Watts",   color: "#1e9cbb"],
                [value: "6000 Watts",   color: "#90d2a7"],
                [value: "9000 Watts",   color: "#44b621"],
                [value: "12000 Watts",  color: "#f1d801"],
                [value: "15000 Watts",  color: "#d04e00"], 
                [value: "18000 Watts",  color: "#bc2323"]  
                */
            ]
        )
    }
    valueTile("powerOne", "device.powerOne", decoration: "flat") {
        state("default", label:'${currentValue}')
    }
    valueTile("powerTwo", "device.powerTwo", decoration: "flat") {
        state("default", label:'${currentValue}')
    }

// Power row

    valueTile("energyDisp", "device.energyDisp") {
        state("default", label: '${currentValue}', backgroundColor:"#ffffff")
    }
    valueTile("energyOne", "device.energyOne") {
        state("default", label: '${currentValue}', backgroundColor:"#ffffff")
    }        
    valueTile("energyTwo", "device.energyTwo") {
        state("default", label: '${currentValue}', backgroundColor:"#ffffff")
    }
    

// Volts row

    valueTile("voltsDisp", "device.voltsDisp") {
        state "default", label: '${currentValue}', backgroundColors:[
            [value: "115.6 Volts",  color: "#bc2323"],
            [value: "117.8 Volts",  color: "#D04E00"],
            [value: "120.0 Volts",  color: "#44B621"],
            [value: "122.2 Volts",  color: "#D04E00"],
            [value: "124.4 Volts",  color: "#bc2323"]
        ]
    }
    valueTile("voltsOne", "device.voltsOne", decoration: "flat") {
        state "default", label:'${currentValue}'
    }
    valueTile("voltsTwo", "device.voltsTwo", decoration: "flat") {
        state "default", label:'${currentValue}'
    }

// Amps row

    valueTile("ampsDisp", "device.ampsDisp") {
        state "default", label: '${currentValue}' , foregroundColor: "#000000", color: "#000000", backgroundColors:[
            [value: "0 Amps",   color: "#153591"],
            [value: "25 Amps",  color: "#1e9cbb"],
            [value: "50 Amps",  color: "#90d2a7"],
            [value: "75 Amps",  color: "#44b621"],
            [value: "100 Amps", color: "#f1d801"],
            [value: "125 Amps", color: "#d04e00"], 
            [value: "150 Amps", color: "#bc2323"]
        ] 
    }
    valueTile("ampsOne", "device.ampsOne", decoration: "flat") {
        state "default", label:'${currentValue}'
    }
    valueTile("ampsTwo", "device.ampsTwo", decoration: "flat") {
        state "default", label:'${currentValue}'
    }

// Controls row

    standardTile("reset", "device.energy", inactiveLabel: false) {
        state "default", label:'reset', action:"reset", icon: "st.Health & Wellness.health7"
    }
    standardTile("refresh", "device.power", inactiveLabel: false, decoration: "flat" ) {
        state "default", label:'', action:"refresh.refresh", icon:"st.secondary.refresh"
    }
    standardTile("configure", "device.power", inactiveLabel: false, decoration: "flat") {
        state "configure", label:'', action:"configure", icon:"st.secondary.configure"
    }
    valueTile("battery", "device.battery", inactiveLabel: false, decoration: "flat") {
        state "battery", label:'${currentValue}% battery', unit:""
    }

// TODO: Add configurable delay button - Cycle through 10s, 30s, 1m, 5m, 60m, off?

    main (["powerDisp","energyDisp","ampsDisp","voltsDisp"])
    details([
        "energyOne","energyDisp","energyTwo",
        "powerOne","powerDisp","powerTwo",
        //"ampsOne","ampsDisp","ampsTwo",         // Comment out these two lines for HEMv!
        //"voltsOne","voltsDisp","voltsTwo",      // Comment out these two lines for HEMv1
        "reset","refresh", "battery", "configure"
    ])
}
preferences {
    input "kWhCost", "string", title: "\$/kWh (0.16)", defaultValue: "0.16" as String
}

}

def parse(String description) {
// log.debug “Parse received {description}" def result = null def cmd = zwave.parse(description, [0x31: 1, 0x32: 1, 0x60: 3]) if (cmd) { result = createEvent(zwaveEvent(cmd)) } if (result) log.debug "Parse returned {result}”
return result
}

def zwaveEvent(physicalgraph.zwave.commands.meterv1.MeterReport cmd) {
// log.debug “zwaveEvent received ${cmd}”

def dispValue
def newValue
def timeString = new Date().format("h:mm a", location.timeZone)

if (cmd.meterType == 33) {
    if (cmd.scale == 0) {
        newValue = cmd.scaledMeterValue
        if (newValue != state.energyValue) {
            dispValue = String.format("%5.2f",newValue)+"\nkWh"
            sendEvent(name: "energyDisp", value: dispValue as String, unit: "")
            state.energyValue = newValue
            BigDecimal costDecimal = newValue * ( kWhCost as BigDecimal)
            def costDisplay = String.format("%3.2f",costDecimal)
            sendEvent(name: "energyTwo", value: "Cost\n\$${costDisplay}", unit: "")
            [name: "energy", value: newValue, unit: "kWh"]
        }
    } else if (cmd.scale == 1) {
        newValue = cmd.scaledMeterValue
        if (newValue != state.energyValue) {
            dispValue = String.format("%5.2f",newValue)+"\nkVAh"
            sendEvent(name: "energyDisp", value: dispValue as String, unit: "")
            state.energyValue = newValue
            [name: "energy", value: newValue, unit: "kVAh"]
        }
    }
    else if (cmd.scale==2) {                
        newValue = Math.round( cmd.scaledMeterValue )       // really not worth the hassle to show decimals for Watts
        if (newValue != state.powerValue) {
            dispValue = newValue+"\nWatts"
            sendEvent(name: "powerDisp", value: dispValue as String, unit: "")
            
            if (newValue < state.powerLow) {
                dispValue = "Low\n"+newValue+" W\n"+timeString
                sendEvent(name: "powerOne", value: dispValue as String, unit: "")
                state.powerLow = newValue
            }
            if (newValue > state.powerHigh) {
                dispValue = "High\n"+newValue+" W\n"+timeString
                sendEvent(name: "powerTwo", value: dispValue as String, unit: "")
                state.powerHigh = newValue
            }
            state.powerValue = newValue
            [name: "power", value: newValue, unit: "W"]
        }
    }
}
else if (cmd.meterType == 161) {
    if (cmd.scale == 0) {
        newValue = cmd.scaledMeterValue
        if (newValue != state.voltsValue) {
            dispValue = String.format("%5.2f", newValue)+"\nVolts"
            sendEvent(name: "voltsDisp", value: dispValue as String, unit: "")

            if (newValue < state.voltsLow) {
                dispValue = "Low\n"+String.format("%5.2f", newValue)+" V\n"+timeString
                sendEvent(name: "voltsOne", value: dispValue as String, unit: "")                   
                state.voltsLow = newValue
            }
            if (newValue > state.voltsHigh) {
                dispValue = "High\n"+String.format("%5.2f", newValue)+" V\n"+timeString
                sendEvent(name: "voltsTwo", value: dispValue as String, unit: "")                    
                state.voltsHigh = newValue
            }                
            state.voltsValue = newValue
            [name: "volts", value: newValue, unit: "V"]
        }
    }
    else if (cmd.scale==1) {
        newValue = cmd.scaledMeterValue
        if (newValue != state.ampsValue) {
            dispValue = String.format("%5.2f", newValue)+"\nAmps"
            sendEvent(name: "ampsDisp", value: dispValue as String, unit: "")
            
            if (newValue < state.ampsLow) {
                dispValue = "Low\n"+String.format("%5.2f", newValue)+" A\n"+timeString
                sendEvent(name: "ampsOne", value: dispValue as String, unit: "")
                state.ampsLow = newValue
            }
            if (newValue > state.ampsHigh) {
                dispValue = "High\n"+String.format("%5.2f", newValue)+" A\n"+timeString
                sendEvent(name: "ampsTwo", value: dispValue as String, unit: "")
                state.ampsHigh = newValue
            }                
            state.ampsValue = newValue
            [name: "amps", value: newValue, unit: "A"]
        }
    }
}           

}

def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) {
def map = [:]
map.name = “battery”
map.unit = “%”
if (cmd.batteryLevel == 0xFF) {
map.value = 1
map.descriptionText = “${device.displayName} has a low battery”
map.isStateChange = true
} else {
map.value = cmd.batteryLevel
}
log.debug map
return map
}

def zwaveEvent(physicalgraph.zwave.Command cmd) {
// Handles all Z-Wave commands we aren’t interested in
log.debug “Unhandled event ${cmd}”
[:]
}

def refresh() {
delayBetween([
zwave.meterV2.meterGet(scale: 0).format(),
zwave.meterV2.meterGet(scale: 2).format()
])
}

def poll() {
refresh()
}

def reset() {
log.debug “${device.name} reset”

state.powerHigh = 0
state.powerLow = 99999
state.ampsHigh = 0
state.ampsLow = 999
state.voltsHigh = 0
state.voltsLow = 999

def dateString = new Date().format("m/d/YY", location.timeZone)
def timeString = new Date().format("h:mm a", location.timeZone)
sendEvent(name: "energyOne", value: "Since\n"+dateString+"\n"+timeString, unit: "")
sendEvent(name: "powerOne", value: "", unit: "")    
sendEvent(name: "voltsOne", value: "", unit: "")
sendEvent(name: "ampsOne", value: "", unit: "")
sendEvent(name: "ampsDisp", value: "", unit: "")
sendEvent(name: "voltsDisp", value: "", unit: "")
sendEvent(name: "powerDisp", value: "", unit: "")    
sendEvent(name: "energyDisp", value: "", unit: "")
sendEvent(name: "energyTwo", value: "Cost\n--", unit: "")
sendEvent(name: "powerTwo", value: "", unit: "")    
sendEvent(name: "voltsTwo", value: "", unit: "")
sendEvent(name: "ampsTwo", value: "", unit: "")

// No V1 available
def cmd = delayBetween( [
zwave.meterV2.meterReset().format(),
zwave.meterV2.meterGet(scale: 0).format()
])

cmd

}

def configure() {
// TODO: Turn on reporting for each leg of power - display as alternate view (Currently those values are
// returned as zwaveEvents…they probably aren’t implemented in the core Meter device yet.

def cmd = delayBetween([
    zwave.configurationV1.configurationSet(parameterNumber: 3, size: 1, scaledConfigurationValue: 0).format(),      // Disable selective reporting, so always update based on schedule below <set to 1 to reduce network traffic>
    zwave.configurationV1.configurationSet(parameterNumber: 4, size: 2, scaledConfigurationValue: 50).format(),     // (DISABLED by first option) Don't send unless watts have changed by 50 <default>
    zwave.configurationV1.configurationSet(parameterNumber: 8, size: 1, scaledConfigurationValue: 10).format(),     // (DISABLED by first option) Or by 10% <default>
    zwave.configurationV1.configurationSet(parameterNumber: 101, size: 4, scaledConfigurationValue: 4).format(),   // Combined energy in Watts
    zwave.configurationV1.configurationSet(parameterNumber: 111, size: 4, scaledConfigurationValue: 15).format(),   // Every 15 Seconds (for Watts)
    zwave.configurationV1.configurationSet(parameterNumber: 102, size: 4, scaledConfigurationValue: 8).format(),    // Combined energy in kWh
    zwave.configurationV1.configurationSet(parameterNumber: 112, size: 4, scaledConfigurationValue: 60).format(),  // every 60 seconds (for kWh)
    zwave.configurationV1.configurationSet(parameterNumber: 103, size: 4, scaledConfigurationValue: 0).format(),    // Disable report 3
    zwave.configurationV1.configurationSet(parameterNumber: 113, size: 4, scaledConfigurationValue: 0).format()   // Disable report 3
])
log.debug cmd

cmd

}

@stewartad1, re-reading your original question…

You want to use your own image, so you’ll need to update the code to include:

, canChangeIcon: true, canChangeBackground: true

oh, and I just saw your post above, give me a sec to look through that.

@stewartad1,

Yep, you have an old version. There’s been a lot of change since then. You can either still use the code you have and modify a couple lines of code, or go with a new device type that has the new look of ST (my images from above). I recommend going with the newer look. The new code will also resolve your date issue.

I found his latest code from another thread, and made the updates for you so that you can use your own image:

https://raw.githubusercontent.com/constjs/SmartThings-Devices/master/drshaw_hemv1.device.groovy

You will need to create a new device type, and then edit the device in the IDE to use your new code, just like you did for the device type you are using now.

After you do all that, go into the phone app, and when you edit the device you will now see “Set Device Image”. That will allow you to pick your own. I just tested it, and it works!

Now, if you opt to use the code you have now, replace:

this: label:'${currentValue}',

with this: label:'${currentValue}', canChangeIcon: true, canChangeBackground: true,

in the valueTile section in the Watts row for “powerDisp”. That should do the trick even though background colors are being used.

Either way, you’ll continue to build up your coding skills!

Also,I saw that your High value is crazy high. Once you reset Watts that will go away, but it will come back. There is a firmware update for HEMv1, and there’s a discussion about that here:

Ok, I went with the new code:
https://raw.githubusercontent.com/constjs/SmartThings-Devices/master/drshaw_hemv1.device.groovy

The set device image is there now, when I set it and press done, then go to the “things” page, the image is a light bulb, when I go back to edit the device, the image that I choose disappeared. Any thoughts on what I did wrong?

For your comment about [quote=“johnconstantelo, post:18, topic:19499”]
Also,I saw that your High value is crazy high. Once you reset Watts that will go away, but it will come back. There is a firmware update for HEMv1, and there’s a discussion about that here:
[/quote], by volume being high, are you referring to the middle right tile at 6:14 this morning? Just curious what you mean by volume.

I will look into upgrading the firmware but my problem is I don’t have a windows computer and the firmware is a .exe and I don’t want to pay for parallels or bootcamp and windows for my mac.

Here is a picture of my install of the HEM. My house has two circuit breakers boxes in the basement and I didn’t want to get two HEMs so I installed the HEM outside in the meter box (had to go around the incoming feed).

Thanks,
Dave

Hi @stewartad1, sorry for the late reply. I literally headed out as soon as made that last post, but I’m back now.

You did nothing wrong. It’s a bug in the app. Same thing happens on Android. Usually the 2nd or 3rd time you try it will take.

Yup, that’s it. That’s way too high. The firmware update will resolve that, and/or a complete reset of settings. To reset all settings, look at the community discussion I posted above about troubleshooting, and then look at the second to last entry.

You have a very similar set up as mine, so your clamps are good. Even if you turned everything on all at once, I can’t imagine you’d draw barely 1/2 that value. Maybe a friend or neighbor that has a Windows PC can help you out.