Skip to content
Snippets Groups Projects

SHM SmartApp

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    The snippet can be accessed without any authentication.
    Authored by Erick Hitter
    Edited
    shm-smartapp.groovy 3.49 KiB
    /**
     *  MQTT SHM Bridge
     *
     *  Authors
     *   - open-source@ethitter.com
     *
     *  Copyright 2016
     *
     *  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.
     */
    import groovy.json.JsonSlurper
    import groovy.json.JsonOutput
    import groovy.transform.Field
    
    definition(
        name: "MQTT SHM Bridge",
        namespace: "eth",
        author: "erick t. hitter",
        description: "Control Smart Home Monitor over MQTT",
        category: "My Apps",
        iconUrl: "https://s3.amazonaws.com/smartapp-icons/Connections/Cat-Connections.png",
        iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Connections/Cat-Connections@2x.png",
        iconX3Url: "https://s3.amazonaws.com/smartapp-icons/Connections/Cat-Connections@3x.png"
    )
    
    preferences {
        section ("Bridge") {
            input "bridge", "capability.notification", title: "Notify this Bridge", required: true, multiple: false
        }
    }
    
    def installed() {
        log.debug "Installed with settings: ${settings}"
    
        runEvery15Minutes(initialize)
        initialize()
    }
    
    def updated() {
        log.debug "Updated with settings: ${settings}"
    
        // Unsubscribe from all events
        unsubscribe()
        // Subscribe to stuff
        initialize()
    }
    
    // Return list of displayNames
    def getDeviceNames(devices) {
        def list = []
        devices.each{device->
            list.push(device.displayName)
        }
        list
    }
    
    def initialize() {
        // Subscribe to events from SmartThings
        subscribe(location, "alarmSystemStatus", inputHandler)
        subscribe(location, "Security", inputHandler)
    
        // Subscribe to events from the bridge
        subscribe(bridge, "message", bridgeHandler)
    
        // Update the bridge
        updateSubscription()
    }
    
    // Update the bridge"s subscription
    def updateSubscription() {
        def attributes = [
            alarmSystemStatus: ["alarm system status"]
        ]
    
        def json = new groovy.json.JsonOutput().toJson([
            path: "/subscribe",
            body: [
                devices: attributes
            ]
        ])
    
        log.debug "Updating subscription: ${json}"
    
        bridge.deviceNotification(json)
    }
    
    // Receive an event from the bridge
    def bridgeHandler(evt) {
        def json = new JsonSlurper().parseText(evt.value)
        log.debug "Received device event from bridge: ${json}"
    
        if (json.type == "alarmSystemStatus") {
            sendLocationEvent(name: "alarmSystemStatus", value: "${json.value}")
            return
        }
    }
    
    // Receive an event from a device
    def inputHandler(evt) {
        def value
    
        switch(evt.value) {
            case "stay":
                value = "armed_home"
            break
            case "away":
                value = "armed_away"
            break
            case "off":
                value = "disarmed"
            break
    
            default:
                value = false
            break
        }
    
        if ( value == false ) {
           log.debug "Unknown SHM event: ${evt.value}"
           return
        }
    
        def json = new JsonOutput().toJson([
            path: "/push",
            body: [
                name: evt.displayName,
                value: value,
                type: evt.name
            ]
        ])
    
        log.debug "Forwarding device event to bridge: ${json}"
        bridge.deviceNotification(json)
    }
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment