SANdood / Aeon-HEM-v2

My version of the ST device driver for the Aeon HEM, exended to support the V2 version, with more displays
42 stars 121 forks source link

Device Type error #1

Open GoNoles opened 9 years ago

GoNoles commented 9 years ago

I just installed this latest codebase as a Device Type, and I am still getting this error.

I have a HEM v1 and I've commented/uncommented the code appropriately/etc.

error java.lang.NullPointerException: Cannot invoke method toByteArray() on null object @ line 796

SANdood commented 9 years ago

Try changing “kDelay” and “dDelay” to specific numbers in the two zwave.configurationv1.configurationSet commands…

From: GoNoles [mailto:notifications@github.com] Sent: Wednesday, January 21, 2015 3:20 PM To: SANdood/Aeon-HEM-v2 Subject: [Aeon-HEM-v2] Device Type error (#1)

I just installed this latest codebase as a Device Type, and I am still getting this error.

I have a HEM v1 and I've commented/uncommented the code appropriately/etc.

error java.lang.NullPointerException: Cannot invoke method toByteArray() on null object @ line 796

— Reply to this email directly or view it on GitHub https://github.com/SANdood/Aeon-HEM-v2/issues/1 . https://github.com/notifications/beacon/AHpYUINmlj8tR4f-zVlQp3-FDXwS_cStks5nkAF5gaJpZM4DVcMq.gif

mahoekst commented 9 years ago

This is the code which is working for my V1:

/**

// v1 fingerprint deviceId: "0x2101", inClusters: " 0x70,0x31,0x72,0x86,0x32,0x80,0x85,0x60"

    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: 1).format(),      // Enable selective reporting
    zwave.configurationV1.configurationSet(parameterNumber: 4, size: 2, scaledConfigurationValue: 50).format(),     // Don't send unless watts have increased by 50
    zwave.configurationV1.configurationSet(parameterNumber: 8, size: 2, scaledConfigurationValue: 10).format(),     // Or by 10% (these 3 are the default values
    zwave.configurationV1.configurationSet(parameterNumber: 101, size: 4, scaledConfigurationValue: 10).format(),   // Average Watts & Amps
    zwave.configurationV1.configurationSet(parameterNumber: 111, size: 4, scaledConfigurationValue: 30).format(),   // Every 30 Seconds
    zwave.configurationV1.configurationSet(parameterNumber: 102, size: 4, scaledConfigurationValue: 4).format(),    // Average Voltage
    zwave.configurationV1.configurationSet(parameterNumber: 112, size: 4, scaledConfigurationValue: 150).format(),  // every 2.5 minute
    zwave.configurationV1.configurationSet(parameterNumber: 103, size: 4, scaledConfigurationValue: 1).format(),    // Total kWh (cumulative)
    zwave.configurationV1.configurationSet(parameterNumber: 113, size: 4, scaledConfigurationValue: 300).format()   // every 5 minutes
])
log.debug cmd

cmd

}

Sent from Windows Mail

From: Barry Burkemailto:notifications@github.com Sent: ?Wednesday?, ?January? ?21?, ?2015 ?2?:?46? ?PM To: SANdood/Aeon-HEM-v2mailto:Aeon-HEM-v2@noreply.github.com

Try changing "kDelay" and "dDelay" to specific numbers in the two zwave.configurationv1.configurationSet commands...

From: GoNoles [mailto:notifications@github.com] Sent: Wednesday, January 21, 2015 3:20 PM To: SANdood/Aeon-HEM-v2 Subject: [Aeon-HEM-v2] Device Type error (#1)

I just installed this latest codebase as a Device Type, and I am still getting this error.

I have a HEM v1 and I've commented/uncommented the code appropriately/etc.

error java.lang.NullPointerException: Cannot invoke method toByteArray() on null object @ line 796

Reply to this email directly or view it on GitHub https://github.com/SANdood/Aeon-HEM-v2/issues/1 . https://github.com/notifications/beacon/AHpYUINmlj8tR4f-zVlQp3-FDXwS_cStks5nkAF5gaJpZM4DVcMq.gif

Reply to this email directly or view it on GitHubhttps://github.com/SANdood/Aeon-HEM-v2/issues/1#issuecomment-70937705.

GoNoles commented 9 years ago

mahoekst - your code is working fine for me - thanks!