# OpenGarage Binding

The OpenGarage binding allows you to control an OpenGarage controller (<https://opensprinkler.com/product/opengarage/>) using openHAB.

## Supported Things

OpenGarage controllers from <https://opensprinkler.com/product/opengarage/> are supported.

## Discovery

Auto-discovery is not currently supported.
You need to manually add a new item using its IP address.

## Thing Configuration

As a minimum, the IP address is needed:

- `hostname` - The hostname of the OpenGarage controller. Typically you'd use an IP address such as `192.168.0.5` for this field.
- `port` - The port the OpenGarage is listening on. Defaults to port 80.
- `refresh` - The frequency with which to refresh information from the OpenGarage controller specified in seconds. Defaults to 60 seconds.
- `password` - The password to send commands to the OpenGarage. Defaults to "opendoor".
- `doorTransitionTimeSeconds` - Specifies how long it takes the garage door to fully open / close after triggering it from OpenGarage, including auditory beeps. Recommend to round up or pad by a second or two.
- `doorOpeningState` - Text state to report when garage is opening. Defaults to "OPENING".
- `doorOpenState` - Text state to report when garage is open (and not in transition). Defaults to "OPEN".
- `doorClosingState` - Text state to report when garage is closing. Defaults to "CLOSING".
- `doorClosedState` - Text state to report when garage is closed (and not in transition). Defaults to "CLOSED".

## Channels

| channel              | type          | description                                                                                                                                                                                                                         |
|----------------------|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| distance             | Number:Length | Distance reading from the OpenGarage controller (default in cm)                                                                                                                                                                     |
| status-switch        | Switch        | Door status (OFF = Closed, ON = Open), set "invert=true" on channel to invert switch                                                                                                                                               |
| status-text          | String        | Text status of the current door state, including transition, using values from configuration: doorOpeningState, doorOpenState, doorClosingState, doorClosedState                                                                    |
| status-contact       | Contact       | Door status (Open or Closed)                                                                                                                                                                                                        |
| status-rollershutter | Rollershutter | Door status (DOWN = Closed, UP = Open)                                                                                                                                                                                              |
| vehicle              | String        | Vehicle presence (deprecated, use vehicle-status instead)                                                                                                                                                                           |
| vehicle-status       | Number        | Report vehicle presence (0=No vehicle detected, 1=Vehicle detected, 2=Vehicle status unknown, 3=Vehicle status not available)                                                                                                       |

## Full Example

opengarage.things:

```java
opengarage:opengarage:OpenGarage [ hostname="192.168.0.5" ]
```

opengarage.items:

```java
Switch OpenGarage_Status { channel="opengarage:opengarage:OpenGarage:status-switch" }
Contact OpenGarage_Status_Contact { channel="opengarage:opengarage:OpenGarage:status-contact" }
Rollershutter OpenGarage_Status_Rollershutter { channel="opengarage:opengarage:OpenGarage:status-rollershutter" }
Number:Length OpenGarage_Distance { channel="opengarage:opengarage:OpenGarage:distance" }
Number OpenGarage_VehicleStatus { channel="opengarage:opengarage:OpenGarage:vehicle-status" }
String OpenGarage_StatusText { channel="opengarage:opengarage:OpenGarage:status-text" }
```

opengarage.sitemap:

```perl
Text item=OpenGarage_StatusText label="Status"
Switch item=OpenGarage_Status icon="garagedoorclosed" mappings=[ON=Open] visibility=[OpenGarage_Status == OFF]
Switch item=OpenGarage_Status icon="garagedooropen" mappings=[OFF=Close] visibility=[OpenGarage_Status == ON]
Switch item=OpenGarage_Status icon="garage"
Contact item=OpenGarage_Status_Contact icon="garage"
Rollershutter item=OpenGarage_Status_Rollershutter icon="garage"
Text item=OpenGarage_Distance label="OG distance"
Text item=OpenGarage_VehicleStatus label="Vehicle Presence"
```

## Adding to HomeKit

If you have the HomeKit extension installed, you can control your OpenGarage instance via your iPhone.
To wire it up to HomeKit, you might specify the following:

opengarage.items

```java
Group  gOpenGarage                      "OpenGarage Door"                                              {homekit="GarageDoorOpener"}
Switch OpenGarage_TargetState "Target state" (gOpenGarage) {homekit="GarageDoorOpener.TargetDoorState", channel="opengarage:opengarage:deadbeef:status-switch"}
String OpenGarage_CurrentState "Current state" (gOpenGarage) {homekit="GarageDoorOpener.CurrentDoorState", channel="opengarage:opengarage:deadbeef:status-text"}
Switch OpenGarage_xxObstruction "Obstruction (do not use)" (gOpenGarage) {homekit="GarageDoorOpener.ObstructionStatus"}
```

The obstruction channel is not bound to any channel.
It's needed because HomeKit requires it, and OpenGarage does not provide it.
HomeKit requires a status for the garage door of `OPEN`, `CLOSED`, `CLOSING`, `OPENING`.
In order to report that, we must provide state transition information.
State transition information is inferred when the garage door state is changed.
For `doorTransitionTimeSeconds` since the last open/close command was issued, the binding reports the state as either `CLOSING` or `OPENING`.
