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
value: 1ist der Wert für occupied und muss zumvalue_typedes Schedules passen; führebacnet.read_scheduleeinmal unter Developer tools → Actions aus, um zu sehen, was dein Schedule verwendet.nonezur Endzeit gibt die Kontrolle an den Wochenplan zurück.- Der Entfernungsschritt löscht jede Ausnahme mit Priorität 11 am Datum des Termins. Nimm eine Priorität, die sonst nichts auf dem Controller für Ausnahmen verwendet.
- Termine, die über Mitternacht gehen, brauchen eine
date_range-Periode statt eines einzelnendate.