import gpiozero.pins.mock from gpiozero import * import aiomqtt import asyncio # ONLY FOR TESTING ON NON RPI Device.pin_factory = gpiozero.pins.mock.MockFactory() relays = [LED(17), LED(27), LED(22), LED(23), LED(5), LED(6), LED(24), LED(25)] """ MAIN: SrvDwn SrvUp OpDwn OpUp 0 1 2 3 SIDE: 4 5 6 7 """ async def task_command2relays(controlClient: aiomqtt.Client): #relayCtrl = lambda cmd, relay: relays[relay].on() if cmd == 1 else relays[relay].off() relayCtrl = lambda cmd, relay: [relays[r].on() if cmd == 1 and r == relay else relays[r].off for r in range(len(relays))] await controlClient.subscribe("p1/projektorji/+/dvigala/#") async with controlClient.messages() as msgs: async for mesg in msgs: mesg: aiomqtt.Message if mesg.topic.matches('p1/projektorji/+/dvigala/#'): msgTopicArr = mesg.topic.value.split('/') cmnd = mesg.payload.decode() print("Received: [" + str(msgTopicArr) + "] payload: [" + cmnd + "]") testCase = (msgTopicArr[2], msgTopicArr[4]) match testCase: case ('glavni', 'servis_dol'): relayCtrl(cmnd, 0) print('GLAVNI: SERVIS_DOL: ' + cmnd) case ('glavni', 'servis_gor'): relayCtrl(cmnd, 1) print('GLAVNI: SERVIS_GOR: ' + cmnd) case ('glavni', 'delovni_dol'): relayCtrl(cmnd, 2) print('GLAVNI: DELOVNI_DOL: ' + cmnd) case ('glavni', 'delovni_gor'): relayCtrl(cmnd, 3) print('GLAVNI: DELOVNI_GOR: ' + cmnd) case ('stranski', 'servis_dol'): relayCtrl(cmnd, 4) print('GLAVNI: SERVIS_DOL: ' + cmnd) case ('stranski', 'servis_gor'): relayCtrl(cmnd, 5) print('GLAVNI: SERVIS_GOR: ' + cmnd) case ('stranski', 'delovni_dol'): relayCtrl(cmnd, 6) print('GLAVNI: DELOVNI_DOL: ' + cmnd) case ('stranski', 'delovni_gor'): relayCtrl(cmnd, 7) print('GLAVNI: DELOVNI_GOR: ' + cmnd) case _: print("Unrecognized command.") continue print("Pushing \'off\' to other relays to prevent conflicts") await asyncio.sleep(0.01) async def main(): async with aiomqtt.Client('localhost', 1883) as client: task_control = asyncio.create_task(task_command2relays(client)) await asyncio.gather(task_control) if __name__ == '__main__': asyncio.run(main())