The app:
definition(
name: "Projector automation",
namespace: "HomeCinema",
author: "Anders",
description: "Turn off lights when projector starts and turn them back on when it turns off",
category: "Home cinema",
iconUrl: "",
iconX2Url: "")
preferences {
page(name: "mainPage")
}
def mainPage() {
dynamicPage(name: "mainPage", title: "Settings", install: true, uninstall: true) {
section("Projector and Lights") {
input name: "triggerType", type: "enum", title: "How do you want to detect projector on/off state?",
options: ["power": "Power Meter (Watt)", "switch": "Switch (On/Off)", "contact": "Contact sensor"],
submitOnChange: true, required: true
if (triggerType == "power")
input name: "projectorPower", type: "capability.powerMeter", title: "Projector (Power)", required: true
if (triggerType == "switch")
input name: "projectorSwitch", type: "capability.switch", title: "Projector (Toggle event)", required: true
if(triggerType == "contact")
input name: "projectorContact", type: "capability.contactSensor", title: "Projector (Contact sensor)", required: true
input name: "lights", type: "capability.switch", title: "Lights", multiple: true, required: true
}
if (triggerType == "power") {
section("Power thresholds") {
input name: "powerOn", type: "number", title: "What power count as on (W)", defaultValue: 150, required: true
input name: "powerOff", type: "number", title: "What power count as off (W)", defaultValue: 10, required: true
}
}
}
}
def initialize() {
state.running = false
state.affectedLights = []
if (triggerType == "power")
subscribe(projectorPower, "power", powerHandler)
if(triggerType == "switch")
subscribe(projectorSwitch, "switch", switchHandler)
if(triggerType == "contact")
subscribe(projectorContact, "contact", contactHandler)
}
def installed() {
initialize()
}
def updated() {
unsubscribe()
initialize()
}
def uninstalled() {}
def powerHandler(e) {
toggleState(e.doubleValue > powerOn, e.doubleValue < powerOff)
}
def switchHandler(e) {
def on = (e.value == "on")
toggleState(on, !on)
}
def contactHandler(e) {
def on = e.value != "open"
toggleState(on, !on)
}
def toggleState(on, off) {
if(!state.running && on)
onPowerOn()
else if(state.running && off)
onPowerOff()
}
def onPowerOn() {
state.running = true
def onLights = lights.findAll { it.currentValue("switch") == "on" }
onLights.each { light ->
light.off()
}
state.affectedLights = onLights.collect { it.id }
}
def onPowerOff() {
state.running = false
lights
.findAll { state.affectedLights.contains(it.id) }
.each { it.on() }
}