jenswilly.dk


Hörmann UAP 1 controlled from KNX

The final interface board (click for full size)

In our new house, we're installing KNX as the primary infrastructure for home automation.
And obviously, I want to connect the garage door to the home automation system. Both to be able to run automations whenever the door opens or closes and to be able to control it from other devices than the standard remote control.

My solution comprises the following components:

KNX bus → KNX I/O unit → interface board → UAP 1 → garage door opener → scary outside world

In brief:

  • The KNX bus is attached to a Zennio BIN 44 input/output module
  • The Zennio I/O module is connected to my own Interface board
  • The Interface board is connected to the Hörmann UAP 1 interface module
  • The UAP 1 is connected to the garage door opener

UAP 1

My garage door is a Hörmann door and the controller has only very limited options for controlling it using external devices. Fortunately, Hörmann has an optional "interface device" named UAP 1 (short for Universaladapterplatine) which connects to the door opener and has both status outputs and control inputs (presentation video here).

Interface board

On the KNX side, I'm using a Zennio BIN 44 input/output module which has both binary inputs and 2 mA LED outputs.

The inputs are fine as they are and they can be connected directly from the UAP 1 to the BIN 44. The outputs, however, require a little bit of work. The BIN 44 outputs are constant-current outputs for LEDs, delivering 2 mA at a voltage up to 12 V. So I need some way of converting that output to work as a switch.
Also, the output should simulate a "button press" so an active output should be converted to a pulse as opposed to being permanantly on.

I decided to use a 555 timer for the pulse functionality and use a N-channel MOSFET as the switch (yes, this doesn't completely isolate the circuits but that is fine).

An LED is used to demand a voltage high enough to supply the timer IC.

So the basic circuit is as follows (output pulse only, the R2-C2 values can be tweaked to produce an appropriate pulse length):

Output circuit

The R-C on the trigger pin serves two purposes:

  1. Invert the signal so the active-low trigger activates when the output pulse goes high.
  2. Avoid re-triggering if the activation pulse duration exceeds the timer output pulse duration.

KNX parameterization and HomeKit integration

For the input, the Zennio BIN 44 is configured "Switch/sensor" sending 1 for rising edge and 0 for falling edge. Values are sent as a 1.001 1-bit switch object.

This configures it as a read-only switch with a value of 0 or 1 corresponding to the value of the UAP 1 output value.

The LED output is configured as a timer with a 2 second "On Duration". This is a 1-bit 1.010 start/stop object. So to activate, simple send 1 to the corresponding group address. It is not necessary to send 0.

For testing, I have configured one of the buttons on a four-gang KNX Fuga switch as switching, 1-bit value object, ON telegram and using status feedback object for LED indication. The switch object is associated to the BIN 44's LED output group address and the status feedback object is associated to the BIN 44's switch/sensor group address.

So pressing the button will trigger the output pulse and the LED will light up if the input is high. All is good.

Home Assistant

In the Home Assistant configuration.yamlI have added one binary sensor to mirror the input status (4/4/3 is the group address of the BIN 44's input object):

binary_sensor:
  - platform: knx
    name: 'garage open'
    state_address: '4/4/3'

Next, a "Cover" object is configured:

cover:
  - platform: template
    covers:
      garage_door:
        friendly_name: "Garage Door"
        device_class: garage
        value_template: "{{ is_state('binary_sensor.garage_open', 'on') }}"
        open_cover:
          service: knx.send
          data:
            address: '4/0/3'
            payload: 1
        close_cover:
          service: knx.send
          data:
            address: '4/1/3'
            payload: 1
        icon_template: >-
          {% if is_state('binary_sensor.garage_open', 'on') %}
            mdi:garage-open
          {% else %}
            mdi:garage
          {% endif %}

This one is slightly more complex.
open_cover and close_cover sends a 1 to the group address corresponding to the BIN 44's LED output connected to "open" (4/0/3) and "close" (4/1/3), respectively. Note: we're never sending a 0. We are activating the relevant output – i.e. pressing the switch for "open" or "close".
The value is taken from the value_template which returns true if the binary_sensor.garage_open has a state of "on".
Lastly, an icon_template is used to show either a "garage door open" or "garage door closed" icons based on the state of the binary_sensor.garage_open.

Apple HomeKit

Fortunately, Home Assistant's HomeKit integration supports cover objects (read the docs) so simply adding cover.garage_door to the list of included entities in the homekit configuration allows the garage door to be controlled from HomeKit. So Siri commands ("Siri, open the garage door", "Siri, is the garage door open?" etc.) work perfectly. And the HomeKit entity can be configured to send notifications when the door is opened or closed.

Home Assistant is awesome! 🥳

Leave a Reply