BACnet-Automatisierungsbeispiele für Home Assistant

Vollständige Automatisierungen für typische Aufgaben. Ersetze die Entitäts-IDs durch deine eigenen. Die Beispiele verwenden die Automatisierungssyntax von Home Assistant 2024.10 und neuer.

Anwesenheit per Kalender übersteuern

Setze einen Bereich auf occupied, solange ein Kalendertermin läuft, und gib den Befehl am Ende frei, damit der eigene Schedule des Controllers wieder übernimmt. Aktionen: bacnet.write_value und bacnet.relinquish. Das Anwesenheitsobjekt ist hier ein Multi-State Output (eine number-Entität); im Attribut bacnet_state_text siehst du, welcher Wert auf deinem Gerät occupied bedeutet.

alias: Meeting room occupied during calendar events
triggers:
  - trigger: calendar
    event: start
    entity_id: calendar.meeting_room
    id: start
  - trigger: calendar
    event: end
    entity_id: calendar.meeting_room
    id: end
actions:
  - choose:
      - conditions:
          - condition: trigger
            id: start
        sequence:
          - action: bacnet.write_value
            target:
              entity_id: number.meeting_room_occupancy
            data:
              value: 1        # occupied on this device
              priority: 11
    default:
      - action: bacnet.relinquish
        target:
          entity_id: number.meeting_room_occupancy
        data:
          priority: 11        # release the same priority you wrote at

Gib immer mit der Priorität frei, mit der du geschrieben hast. Einen Switch auszuschalten oder 0 zu schreiben befiehlt dem Objekt, aus zu sein; nur bacnet.relinquish gibt es frei.

Befristeter Sollwert mit einer Climate-Entität

Setze morgens einen Komfort-Sollwert und gib abends die Regelung an den Controller zurück. Eine BACnet-Climate-Entität auszuschalten gibt ihren Sollwert frei. Siehe Climate.

alias: Office comfort setpoint on weekdays
triggers:
  - trigger: time
    at: "07:00:00"
    id: "on"
  - trigger: time
    at: "18:00:00"
    id: "off"
conditions:
  - condition: time
    weekday: [mon, tue, wed, thu, fri]
actions:
  - if:
      - condition: trigger
        id: "on"
    then:
      - action: climate.set_temperature
        target:
          entity_id: climate.office_setpoint
        data:
          temperature: 21.5
    else:
      - action: climate.set_hvac_mode
        target:
          entity_id: climate.office_setpoint
        data:
          hvac_mode: "off"

Benachrichtigt werden, wenn ein Gerät nicht mehr antwortet

Entitäten werden unavailable, wenn ihr Gerät nicht antwortet. Nach 10 fehlgeschlagenen Pollings erscheint zusätzlich eine Meldung unter Settings → Repairs; diese Automatisierung benachrichtigt dich früher. Siehe auch Fehlerbehebung.

alias: BACnet device offline
triggers:
  - trigger: state
    entity_id: sensor.ahu_1_supply_temperature
    to: unavailable
    for: "00:05:00"
actions:
  - action: notify.notify
    data:
      message: "AHU 1 is not responding to BACnet requests."

Bei BACnet-Alarmen benachrichtigen

Nutzt das Ereignis bacnet_alarm; siehe Alarme.

alias: BACnet alarm notification
triggers:
  - trigger: event
    event_type: bacnet_alarm
actions:
  - action: notify.notify
    data:
      message: >-
        {% if trigger.event.data.event_state == 'normal' %}
          Alarm cleared: {{ trigger.event.data.object_name }}
        {% else %}
          Alarm: {{ trigger.event.data.object_name }} is {{ trigger.event.data.event_state }}
        {% endif %}

Kalendertermine als Schedule-Ausnahmen

Statt den Controller zu übersteuern, fügst du jeden Kalendertermin als Ausnahme zu seinem Schedule-Objekt hinzu. Der Controller kennt den Termin dann im Voraus, sodass Funktionen wie Optimum Start den Raum vorbereiten können. Die Regeln stehen unter Schedules. Diese Automatisierung fügt die Ausnahme 12 Stunden vor dem Termin hinzu und entfernt sie, wenn der Termin endet.

alias: Calendar events as BACnet schedule exceptions
triggers:
  - trigger: calendar
    event: start
    entity_id: calendar.meeting_room
    offset: "-12:00:00"
    id: add
  - trigger: calendar
    event: end
    entity_id: calendar.meeting_room
    id: remove
actions:
  - action: bacnet.read_schedule
    target:
      entity_id: sensor.meeting_room_schedule
    response_variable: schedule
  - variables:
      event_start: "{{ trigger.calendar_event.start }}"
      event_end: "{{ trigger.calendar_event.end }}"
      current: "{{ schedule['sensor.meeting_room_schedule'].exception_schedule or [] }}"
  - if:
      - condition: trigger
        id: add
    then:
      - action: bacnet.write_schedule
        target:
          entity_id: sensor.meeting_room_schedule
        data:
          exception_schedule: >-
            {% set start = as_local(as_datetime(event_start)) %}
            {% set end = as_local(as_datetime(event_end)) %}
            {{ current + [{
                 'period': {'date': start.date().isoformat()},
                 'priority': 11,
                 'time_values': [
                   {'time': start.strftime('%H:%M:%S'), 'value': 1},
                   {'time': end.strftime('%H:%M:%S'), 'value': none}
                 ]
               }] }}
    else:
      - action: bacnet.write_schedule
        target:
          entity_id: sensor.meeting_room_schedule
        data:
          exception_schedule: >-
            {% set start = as_local(as_datetime(event_start)) %}
            {% set ns = namespace(keep=[]) %}
            {% for ex in current %}
              {% set d = ex.period.get('date') %}
              {% if not (d and ex.priority == 11 and d.year == start.year
                         and d.month == start.month and d.day == start.day) %}
                {% set ns.keep = ns.keep + [ex] %}
              {% endif %}
            {% endfor %}
            {{ ns.keep }}
          allow_removal: true