Initial commit

This commit is contained in:
EpicKiwi 2023-07-19 10:20:07 +02:00
commit 27f8dbadea
Signed by: epickiwi
GPG Key ID: C4B28FD2729941CE
7 changed files with 103 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
__pycache__
.venv

80
main.py Executable file
View File

@ -0,0 +1,80 @@
#!/bin/env python
import zigate
from zigate import dispatcher
import time
import os
from datetime import datetime
from settings import MAGNET_ATTRIBUTE, MAGNET_ADDR, MAGNET_ATTRIBUTE_OPENED_VALUE, OPENING_TRIGGER_DELAY, LOL_OPENED_CMD, LOL_CLOSED_CMD, CLOSING_TRIGGER_DELAY
z = zigate.connect(port=None)
z.get_devices_list()
is_closing = False
is_opening = False
def trigger_opening():
global is_opening
global is_closing
is_closing = False
# An opening is already in process
if is_opening or is_closing:
return
is_opening = True
for i in range(0, OPENING_TRIGGER_DELAY):
z.set_led(on=False)
time.sleep(0.25)
z.set_led(on=True)
time.sleep(0.75)
# Check if we still opening room
if not is_opening:
return
is_opening = False
os.system(LOL_OPENED_CMD)
print(datetime.now().isoformat()+" LOL opened")
def trigger_closing():
global is_opening
global is_closing
if is_opening:
return
is_closing = True
for i in range(0, CLOSING_TRIGGER_DELAY):
time.sleep(1)
# Check if we still opening room
if not is_closing:
return
is_closing = False
is_opening = False
z.set_led(on=True)
os.system(LOL_CLOSED_CMD)
print(datetime.now().isoformat()+" LOL closed")
def on_zigbee_attribute_updated(sender, signal, attribute, **kwargs):
if attribute["addr"] == MAGNET_ADDR and attribute["name"] == MAGNET_ATTRIBUTE:
if attribute["value"] == MAGNET_ATTRIBUTE_OPENED_VALUE:
trigger_opening()
else:
trigger_closing()
dispatcher.connect(on_zigbee_attribute_updated, zigate.ZIGATE_ATTRIBUTE_UPDATED)
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print('Interrupted by user')
z.save_state()
z.close()

1
requirements.txt Normal file
View File

@ -0,0 +1 @@
zigate

17
settings.py Normal file
View File

@ -0,0 +1,17 @@
# ZigBee address of door magnet sensor
MAGNET_ADDR = "d617"
# Attribute name defning if door is opened or not
MAGNET_ATTRIBUTE = "onoff"
# Value of previous attribute that represents opened door
MAGNET_ATTRIBUTE_OPENED_VALUE = True
# Delay to wait before marking room as opened
OPENING_TRIGGER_DELAY = 30
# Delay to wait before marking room as closed
CLOSING_TRIGGER_DELAY = 5
LOL_OPENED_CMD = "ln -f -s a.txt test/status.txt"
LOL_CLOSED_CMD = "ln -f -s b.txt test/status.txt"

1
test/a.txt Normal file
View File

@ -0,0 +1 @@
A : Opened

1
test/b.txt Normal file
View File

@ -0,0 +1 @@
B : Closed

1
test/status.txt Symbolic link
View File

@ -0,0 +1 @@
a.txt