MSA-2119: SmartApp to work with FortrezZ Flow Meter only. Allows user to set consumption goals and get notifications based on their achievement of their set goals. App also provides the user to input their water costs into the calculator, and see what their actual water is costing them as they use it. Notifications will include the cost of their water for the period.

This commit is contained in:
Fortrezz
2017-07-20 08:39:47 -07:00
parent de5f0683d3
commit dbd82d0564
2 changed files with 598 additions and 0 deletions

View File

@@ -0,0 +1,210 @@
/**
* Consumption Metering
*
* Copyright 2016 FortrezZ, LLC
*
* 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.
*
*/
definition(
name: "Consumption Metering",
namespace: "FortrezZ",
author: "FortrezZ, LLC",
description: "Child SmartApp for Consumption Metering rules",
category: "Green Living",
parent: "FortrezZ:FortrezZ Water Consumption Metering",
iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png",
iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png",
iconX3Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png")
preferences {
page(name: "prefsPage", title: "Choose the detector behavior", install: true, uninstall: true)
// Do something here like update a message on the screen,
// or introduce more inputs. submitOnChange will refresh
// the page and allow the user to see the changes immediately.
// For example, you could prompt for the level of the dimmers
// if dimmers have been selected:
//log.debug "Child Settings: ${settings}"
}
def prefsPage() {
def dailySchedule = 0
def daysOfTheWeek = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
dynamicPage(name: "prefsPage") {
section("Set Water Usage Goals") {
input(name: "type", type: "enum", title: "Set a new goal?", submitOnChange: true, options: ruleTypes())
}
def measurementType = "water"
if(type)
{
switch (type) {
case "Daily Goal":
section("Water Measurement Preference"){
input(name: "measurementType", type: "enum", title: "Press to change water measurement options", submitOnChange: true, options: waterTypes())}
section("Threshold settings") {
input(name: "waterGoal", type: "decimal", title: "Daily ${measurementType} Goal", required: true, defaultValue: 0.5)
}
break
case "Weekly Goal":
section("Water Measurement Preference"){
input(name: "measurementType", type: "enum", title: "Press to change water measurement options", submitOnChange: true, options: waterTypes())}
section("Threshold settings") {
input(name: "waterGoal", type: "decimal", title: "Weekly ${measurementType} Goal", required: true, defaultValue: 0.1)
}
break
case "Monthly Goal":
section("Water Measurement Preference"){
input(name: "measurementType", type: "enum", title: "Press to change water measurement options", submitOnChange: true, options: waterTypes())}
section("Threshold settings") {
input(name: "waterGoal", type: "decimal", title: "Monthly ${measurementType} Goal", required: true, defaultValue: 0.1)
}
break
default:
break
}
}
}
}
def ruleTypes() {
def types = []
types << "Daily Goal"
types << "Weekly Goal"
types << "Monthly Goal"
return types
}
def waterTypes()
{
def watertype = []
watertype << "Gallons"
watertype << "Cubic Feet"
watertype << "Liters"
watertype << "Cubic Meters"
return watertype
}
/*
def setDailyGoal(measurementType3)
{
return parent.setDailyGoal(measurementType3)
}
def setWeeklyGoal()
{
return parent.setWeeklyGoal(measurementType)
}
def setMonthlyGoal()
{
return parent.setMonthlyGoal(measurementType)
}
*/
def actionTypes() {
def types = []
types << [name: "Switch", capability: "capabilty.switch"]
types << [name: "Water Valve", capability: "capability.valve"]
return types
}
def deviceCommands(dev)
{
def cmds = []
dev.supportedCommands.each { command ->
cmds << command.name
}
return cmds
}
def installed() {
state.Daily = 0
log.debug "Installed with settings: ${settings}"
app.updateLabel("${type} - ${waterGoal} ${measurementType}")
//schedule(" 0 0/1 * 1/1 * ? *", setDailyGoal())
initialize()
}
def updated() {
log.debug "Updated with settings: ${settings}"
app.updateLabel("${type} - ${waterGoal} ${measurementType}")
unsubscribe()
initialize()
//unschedule()
}
def settings() {
def set = settings
if (set["dev"] != null)
{
log.debug("dev set: ${set.dev}")
set.dev = set.dev.id
}
if (set["valve"] != null)
{
log.debug("valve set: ${set.valve}")
set.valve = set.valve.id
}
log.debug(set)
return set
}
def devAction(action)
{
if(dev)
{
log.debug("device: ${dev}, action: ${action}")
dev."${action}"()
}
}
def isValveStatus(status)
{
def result = false
log.debug("Water Valve ${valve} has status ${valve.currentState("contact").value}, compared to ${status.toLowerCase()}")
if(valve)
{
if(valve.currentState("contact").value == status.toLowerCase())
{
result = true
}
}
return result
}
def initialize() {
// TODO: subscribe to attributes, devices, locations, etc.
}
def uninstalled() {
// external cleanup. No need to unsubscribe or remove scheduled jobs
}
// TODO: implement event handlers