OpenHab2 and Linear NGD00Z-4 Garage Door Controller

Sure thing! The door is controlled through the Switch item, which gets updated if the garage door is manually opened or closed.

ITEMS

Group    gGarageDoorOpener    "Garge Door Openers"    <garagedoor>
Switch    GarageAttached_Door    "Garage Door (Attached) [MAP(garagedoor.map):%s]"    <garagedoor>    (gGarageDoorOpener)
Number    GarageAttached_Door_Position    "Garage Door (Attached) [MAP(garagedoor.map):%s]"    <garagedoor>    (gGarageDoorOpener)    {channel="zwave:device:55555:node5:barrier_state"}
Switch    GarageDetached_Door    "Garage Door (Detached) [MAP(garagedoor.map):%s]"    <garagedoor>    (gGarageDoorOpener)|
Number    GarageDetached_Door_Position    "Garage Door (Detached) [MAP(garagedoor.map):%s]"    <garagedoor>    (gGarageDoorOpener)    {channel="zwave:device:55555:node55:barrier_state"}

DSL RULE

// put this import at the top of your rule file
import org.eclipse.smarthome.model.script.ScriptServiceUtil

rule "Update garage door state"
when
    Member of gGarageDoorOpener received update
then
    val actionItem = ScriptServiceUtil.getItemRegistry.getItem(if (triggeringItem.name.contains("_Position")) triggeringItem.name.replace("_Position","") else (triggeringItem.name + "_Position"))
    logDebug("Rules", "Garage door event: [{}] was updated to {} ({}): action item [{}], current state {} ({})", triggeringItem.name, triggeringItem.state, transform("MAP", "garagedoor.map", triggeringItem.state.toString), actionItem.name, actionItem.state, transform("MAP", "garagedoor.map", actionItem.state.toString))
    switch (triggeringItem.state.toString) {
        case "255",//open
        case "254",//opening
        case "253",//stopped
        case "252" : {//closing
            if (actionItem.state != OFF) {
                actionItem.postUpdate(OFF)
                logDebug("Rules", "Garage door event: updated switch [{}] to OFF (OPEN) after barrier_state update", actionItem.name)
            }
        }
        case "0" : {//closed
            if (actionItem.state != ON) {
                actionItem.postUpdate(ON)
                logDebug("Rules", "Garage door event: updated switch [{}] to ON (CLOSED) after barrier_state update", actionItem.name)
            }
        }
        case "ON" : {
            if (actionItem.state != 0) {
                actionItem.sendCommand(0)
                logDebug("Rules", "Garage door event: updated barrier_state [{}] to 0 (CLOSED) after switch state update", actionItem.name)
            }
        }
        case "OFF" : {
            if (actionItem.state != 255) {
                actionItem.sendCommand(255)
                logDebug("Rules", "Garage door event: updated barrier_state [{}] to 255 (OPEN) after switch state update", actionItem.name)
            }
        }
    }

MAP

0=CLOSED
ON=CLOSED
252=CLOSING
253=STOPPED
254=OPENING
255=OPEN
OFF=OPEN
-=Unknown
NULL=Unknown

EDIT: added handling of OPENING, STOPPED, and CLOSING states.
EDIT: removed lambda and change to ‘Member of’ trigger

Here is a similar example that I use for my door locks:

2 Likes