82 lines
2.2 KiB
Python
82 lines
2.2 KiB
Python
"""Example for the telegram monitor callback."""
|
|
import asyncio
|
|
import getopt
|
|
import sys
|
|
|
|
from xknx import XKNX
|
|
from xknx.io import ConnectionConfig, ConnectionType
|
|
from xknx.telegram import AddressFilter
|
|
from structure import parse_message, load_structure, init_value_mapping
|
|
import json
|
|
|
|
from dotenv import load_dotenv
|
|
dotenv_path = join(dirname(__file__), '.env')
|
|
load_dotenv(dotenv_path)
|
|
|
|
from db import publish_measurement
|
|
|
|
config = {}
|
|
mapping = {}
|
|
|
|
|
|
|
|
|
|
async def telegram_received_cb(telegram):
|
|
"""Do something with the received telegram."""
|
|
val = parse_message(config, mapping, telegram)
|
|
publish_measurement(val)
|
|
|
|
|
|
def show_help():
|
|
"""Print Help."""
|
|
print("Telegram filter.")
|
|
print("")
|
|
print("Usage:")
|
|
print("")
|
|
print(__file__, " Listen to all telegrams")
|
|
print(
|
|
__file__, "-f --filter 1/2/*,1/4/[5-6] Filter for specific group addresses"
|
|
)
|
|
print(__file__, "-h --help Print help")
|
|
print("")
|
|
|
|
|
|
async def monitor(address_filters):
|
|
"""Set telegram_received_cb within XKNX and connect to KNX/IP device in daemon mode."""
|
|
connection_config = ConnectionConfig(
|
|
connection_type=ConnectionType.TUNNELING,
|
|
gateway_ip=os.environ.get('KNX_GATEWAY_IP')
|
|
)
|
|
xknx = XKNX(connection_config=connection_config, daemon_mode=True)
|
|
xknx.telegram_queue.register_telegram_received_cb(
|
|
telegram_received_cb, address_filters
|
|
)
|
|
await xknx.start()
|
|
await xknx.stop()
|
|
|
|
|
|
async def main(argv):
|
|
"""Parse command line arguments and start monitor."""
|
|
try:
|
|
opts, _ = getopt.getopt(argv, "hf:", ["help", "filter="])
|
|
except getopt.GetoptError:
|
|
show_help()
|
|
sys.exit(2)
|
|
|
|
global config
|
|
config = load_structure(os.environ.get('KNX_TOPOLOGY'))
|
|
global mapping
|
|
mapping = init_value_mapping()
|
|
|
|
address_filters = None
|
|
for opt, arg in opts:
|
|
if opt in ["-h", "--help"]:
|
|
show_help()
|
|
sys.exit()
|
|
if opt in ["-f", "--filter"]:
|
|
address_filters = list(map(AddressFilter, arg.split(",")))
|
|
await monitor(address_filters)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main(sys.argv[1:])) |