From 8a3eb2de70896123a7f854925d4eff356ea1eda5 Mon Sep 17 00:00:00 2001 From: 0xEmm Date: Tue, 21 May 2024 15:00:13 +0200 Subject: [PATCH] pushi commit kreten sploh ni res.. upam da crknes --- barco_telnet/barco_telnet_control.py | 86 +++++++++++++------ .../extron_audio_matrix_telnet_control.py | 10 +-- mqtt_init_topics.py | 32 +++++++ 3 files changed, 97 insertions(+), 31 deletions(-) create mode 100644 mqtt_init_topics.py diff --git a/barco_telnet/barco_telnet_control.py b/barco_telnet/barco_telnet_control.py index 534e484..855c765 100644 --- a/barco_telnet/barco_telnet_control.py +++ b/barco_telnet/barco_telnet_control.py @@ -1,72 +1,106 @@ import asyncio +import socket import aiomqtt import telnetlib3 +import toml +from socket import gethostname + +mainBarcoIP = '192.168.192.12' +sideBarcoIP = '192.168.192.13' + +# TODO all the checks and stuff +# TODO MAKE THIS CONFIGURALBE cmdMap = { - 'POWER': 'POWR', - 'SHUTTER': 'PMUT', - 'FREEZE': 'FRZE' + 'power': 'POWR', + 'shutter': 'PMUT', + 'freeze': 'FRZE' } reverseCmdMap = {v: k for k, v in cmdMap.items()} + def parse_barco_response(raw: str): raw = raw[1:-1] # strip square brackets #print(raw) if raw.startswith("ERR"): - return None # TODO parse type error - "disabled control" is special case + return None # TODO parse type error - "disabled control" is special case which shouldnt normally happen cmd, status = raw.split("!", maxsplit=2) #print(cmd + " " + status) cmd = reverseCmdMap[cmd] - status = 'ON' if status == '01' else 'OFF' + status = '1' if status == '01' else '0' return cmd, status -async def barco_telnet_command(client, writer): - await client.subscribe("p1/projectors/main/#") +async def barco_telnet_command(client, writer, select: str): + await client.subscribe(f"p1/projektorji/{select}/#") async with client.messages() as msgs: async for mesg in msgs: - if mesg.topic.matches('p1/projectors/main/command/+'): + if mesg.topic.matches('p1/projektorji/{select}/ukaz/+'): cmd = mesg.topic.value.split("/")[-1] - val = '1' if mesg.payload.decode() == 'ON' else '0' + #val = '1' if mesg.payload.decode() == 'ON' else '0' + val = mesg.payload.decode() barcoCmd = f"[{cmdMap[cmd]}{val}]" print("Received: [" + mesg.topic.value + "] payload: [" + mesg.payload.decode() + "]") print("Sending command to Barco: " + barcoCmd) writer.write(barcoCmd) + - -async def barco_telnet_read_status(client, reader): +async def barco_telnet_read_status(client, reader, select: str): while True: output = await reader.readuntil(b']') raw_response: str = output.decode().strip() # strip not necessary? needed for local netcat testing though - print("Received: " + raw_response + " from Barco") + print("Received: " + raw_response + " from Barco (" + select + ')') parsed = parse_barco_response(raw_response) if parsed == None: continue #TODO alert for errors print(f"Updating topic [{parsed[0]}] with value [{parsed[1]}]") - await client.publish(f"p1/projectors/main/status/{parsed[0]}", payload=parsed[1]) + await client.publish(f"p1/projektorji/{select}/status/{parsed[0]}", payload=parsed[1]) -async def barco_telnet_query_status(writer): +async def barco_telnet_query_status(writer, select: str): while True: for val in cmdMap.values(): - print(f"Querying Barco with: [{val}?]") + print(f"Querying Barco {select} with: [{val}?]") writer.write(f"[{val}?]" + '\r\n') # TODO test if funny CRLF necessary (it probably gets ignored) await asyncio.sleep(1) # sleep between writes necessary, otherwise it gets confused. # simultaneous commands from control could break this? TODO fix later await asyncio.sleep(1000) # TODO find appropriate period -async def shell(reader, writer): +# async def shell(reader, writer): +# async with aiomqtt.Client('localhost', 1883) as client: +# task_status_query = asyncio.create_task(barco_telnet_query_status(writer)) +# task_status_reader = asyncio.create_task(barco_telnet_read_status(client, reader)) +# task_control = asyncio.create_task(barco_telnet_command(client, writer)) +# await asyncio.gather(task_status_query, task_status_reader, task_control) + + +async def main(): + #conf = toml.load('config.toml') + #mainBarcoIP = conf[gethostname()]['projektor_glavni'] + #sideBarcoIP = conf[gethostname()]['projektor_stranski'] + mainReader, mainWriter = await telnetlib3.open_connection(mainBarcoIP, 3023) + sideReader, sideWriter = await telnetlib3.open_connection(sideBarcoIP, 3023) async with aiomqtt.Client('localhost', 1883) as client: - task_status_query = asyncio.create_task(barco_telnet_query_status(writer)) - task_status_reader = asyncio.create_task(barco_telnet_read_status(client, reader)) - task_control = asyncio.create_task(barco_telnet_command(client, writer)) - await asyncio.gather(task_status_query, task_status_reader, task_control) + task_status_query_main = asyncio.create_task(barco_telnet_query_status(mainWriter, 'glavni')) + task_status_reader_main = asyncio.create_task(barco_telnet_read_status(client, mainReader, 'glavni')) + task_control_main = asyncio.create_task(barco_telnet_command(client, mainWriter, 'glavni')) + task_status_query_side = asyncio.create_task(barco_telnet_query_status(sideWriter, 'stranski')) + task_status_reader_side = asyncio.create_task(barco_telnet_read_status(client, sideReader, 'stranski')) + task_control_side = asyncio.create_task(barco_telnet_command(client, sideWriter, 'stranski')) + + await asyncio.gather(task_status_query_main, task_status_reader_main, task_control_main, + task_status_query_side, task_status_reader_side, task_control_side) -if __name__ == '__main__': - loop = asyncio.get_event_loop() - #coro = telnetlib3.open_connection('192.168.192.12', 3023, shell=shell) - coro = telnetlib3.open_connection('localhost', 1234, shell=shell) - reader, writer = loop.run_until_complete(coro) - loop.run_until_complete(writer.protocol.waiter_closed) +### fuj to, ne tk delat + +# if __name__ == '__main__': + +# loop = asyncio.get_event_loop() +# #coro = telnetlib3.open_connection('192.168.192.12', 3023, shell=shell) +# coro = telnetlib3.open_connection('localhost', 1234, shell=shell) +# reader, writer = loop.run_until_complete(coro) +# loop.run_until_complete(writer.protocol.waiter_closed) + +asyncio.run(main()) \ No newline at end of file diff --git a/extron_audio_matrix/extron_audio_matrix_telnet_control.py b/extron_audio_matrix/extron_audio_matrix_telnet_control.py index 56187e4..396d139 100644 --- a/extron_audio_matrix/extron_audio_matrix_telnet_control.py +++ b/extron_audio_matrix/extron_audio_matrix_telnet_control.py @@ -7,11 +7,11 @@ from extron_audio_matrix_telnet_interpreter import * async def extron_audio_telnet_status(client, reader): - while True: + while True: #TODO TODO TODO output = await reader.readuntil(b']') raw_response: str = output.decode().strip() # strip not necessary? needed for local netcat testing though print("Received: " + raw_response + " from Barco") - parsed = parse_barco_response(raw_response) + parsed = eam_telnet_code_to_field(raw_response) if parsed == None: continue # TODO alert for errors print(f"Updating topic [{parsed[0]}] with value [{parsed[1]}]") @@ -44,14 +44,14 @@ async def extron_audio_telnet_control(client, writer): # TODO add initial pull async def shell(reader, writer): async with aiomqtt.Client('localhost', 1883) as client: - #task_status_query = asyncio.create_task(extron_audio_telnet_query_status(client, writer, reader)) + task_status_query = asyncio.create_task(extron_audio_telnet_status(client, writer, reader)) task_control = asyncio.create_task(extron_audio_telnet_control(client, writer)) await asyncio.gather(task_control) if __name__ == '__main__': loop = asyncio.get_event_loop() - coro = telnetlib3.open_connection('localhost', 1234, shell=shell) - #coro = telnetlib3.open_connection('192.168.192.14', 23, shell=shell) + #coro = telnetlib3.open_connection('localhost', 1234, shell=shell) + coro = telnetlib3.open_connection('192.168.192.14', 23, shell=shell) reader, writer = loop.run_until_complete(coro) loop.run_until_complete(writer.protocol.waiter_closed) diff --git a/mqtt_init_topics.py b/mqtt_init_topics.py new file mode 100644 index 0000000..23dc1a4 --- /dev/null +++ b/mqtt_init_topics.py @@ -0,0 +1,32 @@ +import asyncio + +import aiomqtt + +async def main(): + async with aiomqtt.Client('localhost', 1883) as client: + await client.publish(f"p1/projektorji/glavni/ukaz/power", payload=0, retain=True) + await client.publish(f"p1/projektorji/glavni/ukaz/shutter", payload=0, retain=True) + await client.publish(f"p1/projektorji/glavni/ukaz/freeze", payload=0, retain=True) + + await client.publish(f"p1/projektorji/stranski/ukaz/power", payload=0, retain=True) + await client.publish(f"p1/projektorji/stranski/ukaz/shutter", payload=0, retain=True) + await client.publish(f"p1/projektorji/stranski/ukaz/freeze", payload=0, retain=True) + + await client.publish(f"p1/projektorji/glavni/dvigalo/delovni_gor", payload=0, retain=True) + await client.publish(f"p1/projektorji/glavni/dvigalo/delovni_dol", payload=0, retain=True) + await client.publish(f"p1/projektorji/glavni/dvigalo/servis_gor", payload=0, retain=True) + await client.publish(f"p1/projektorji/glavni/dvigalo/servis_dol", payload=0, retain=True) + + await client.publish(f"p1/projektorji/stranski/dvigalo/delovni_gor", payload=0, retain=True) + await client.publish(f"p1/projektorji/stranski/dvigalo/delovni_dol", payload=0, retain=True) + await client.publish(f"p1/projektorji/stranski/dvigalo/servis_gor", payload=0, retain=True) + await client.publish(f"p1/projektorji/stranski/dvigalo/servis_dol", payload=0, retain=True) + for i in range(1, 13): + await client.publish(f"p1/releji/r{i}/ukaz", payload=0, retain=True) + + +asyncio.run(main()) + + + +