From 936efa730dfec3b5cb47f0f97a7354dfb884c6f1 Mon Sep 17 00:00:00 2001 From: 0xEmm <goljatsara@gmail.com> Date: Tue, 10 Dec 2024 22:38:02 +0100 Subject: [PATCH] reworked relay controls with i2c relay boards, added lift controls to service panel on frontend --- barco_telnet/barco_telnet_control.py | 31 ++-- docs/MQTT_struktura.md | 12 +- frontend/.DS_Store | Bin 0 -> 6148 bytes frontend/vju_display/.env.development | 2 +- frontend/vju_display/src/App.vue | 5 +- frontend/vju_display/src/components/Lift.vue | 125 ++++++++++++++ .../src/components/pages/LightingPage.vue | 3 +- .../src/components/pages/ServisPage.vue | 36 ++++ poetry.lock | 154 ++++++++++++++++++ projector_motors/projector_motors.py | 124 +++++++++----- pyproject.toml | 21 +++ tse_serial/tse_serial_controler.py | 22 +-- 12 files changed, 458 insertions(+), 77 deletions(-) create mode 100644 frontend/.DS_Store create mode 100644 frontend/vju_display/src/components/Lift.vue create mode 100644 frontend/vju_display/src/components/pages/ServisPage.vue create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/barco_telnet/barco_telnet_control.py b/barco_telnet/barco_telnet_control.py index abe6eda..3e4dd67 100644 --- a/barco_telnet/barco_telnet_control.py +++ b/barco_telnet/barco_telnet_control.py @@ -5,7 +5,7 @@ import telnetlib3 import toml from socket import gethostname -mainBarcoIP = 'localhost' #'192.168.192.12' +mainBarcoIP = '192.168.192.12' sideBarcoIP = '192.168.192.13' # TODO all the checks and stuff @@ -85,30 +85,31 @@ async def barco_telnet_query_status(writer, select: str): async def main(): #conf = toml.load('config.toml') - #mainBarcoIP = conf[gethostname()]['projektor_glavni'] - #sideBarcoIP = conf[gethostname()]['projektor_stranski'] + 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) + sideReader, sideWriter = await telnetlib3.open_connection(sideBarcoIP, 3023) async with aiomqtt.Client('localhost', 1883) as client: 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')) + 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) + 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) ### fuj to, ne tk delat -# if __name__ == '__main__': +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) + loop = asyncio.get_event_loop() + coro = telnetlib3.open_connection(mainBarcoIP, 3023, shell=shell) + coro = telnetlib3.open_connection(mainBarcoIP, 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/docs/MQTT_struktura.md b/docs/MQTT_struktura.md index aa1bf46..3cae43c 100644 --- a/docs/MQTT_struktura.md +++ b/docs/MQTT_struktura.md @@ -17,10 +17,12 @@ - `/move` - `UP`, `DOWN` or `STOP` - `/goto` - `UP` or `DOWN` - `/lift/` - - `up` - 0/1 - - `down` - 0/1 - - `service_up` - 0/1 - - `service_down` - 0/1 + - `status/` blablbabla + - `move/` + - `up` - 0/1 + - `down` - 0/1 + - `service_up` - 0/1 + - `service_down` - 0/1 - `/power/` - Controls power for different parts of the installation - `/master/` - Master power for most hardware in the rack @@ -35,4 +37,4 @@ - `/firanki/` - `status` - `STOPPED`, `MOVING_UP`, `MOVING_DOWN` - - `move` - `STOP`, `MOVE_UP`, `MOVE_DOWN` \ No newline at end of file + - `move` - `STOP`, `MOVE_UP`, `MOVE_DOWN` diff --git a/frontend/.DS_Store b/frontend/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a3312cf105eafdc55bc573aa98706b06272cc605 GIT binary patch literal 6148 zcmeHK!AiqG5S?wSO(;SS3OxqAR;(=u#Y?F52aM=JB_^b3G-gYawn!=DtUu(J_&v_- zZpBi2@FG%XVD`<<&SaUFu#*J<(Hloc0CfPcPzg&m4nGL3lded~cnF1hMg%crFoXnx zm1uVSM+WHK)nEdTFa{sKzrUAonhnE5h8Xc44wE>`TdfaKDp$6)t5(&jS-0MUoO*eX zkF#Ddx~AEMlu5X-gYYsQO#S-qsZ8@AP6s2E5Jv+Hxw(qdNKSiloJN_-_4I;eTee?s z%x3L&tLYqcy7Q(p>ymxkY0u}jwYPtGa_&DRRXlnVU%l<XK>z#AHCs+)MDG?D2& zMl7-yS&Ym8Gr$aNIs@k1vuc}ODA&gfFay74fX)X8mC!X<XjDfB4)ps->lH#0wCOHE z=ooYj78-E{Md(ySohr-~L+Et$J0{LGSZLJgAk@zI9J8}9Hx!|EN57-OLAV-uWCoal zWd_Q6TBrVhw*LOVoWwI`fEm~*21KRr^?O*7>8&fpQLlAS?@&o7uF&|Ef`)3v7)!0V cfvN=k4jG89!9pW?Q20kc(ZB;U@TUxX0uIzpzyJUM literal 0 HcmV?d00001 diff --git a/frontend/vju_display/.env.development b/frontend/vju_display/.env.development index 9499533..5f41f48 100644 --- a/frontend/vju_display/.env.development +++ b/frontend/vju_display/.env.development @@ -1,3 +1,3 @@ -VITE_MQTT_HOST=localhost +VITE_MQTT_HOST=p01malina.local VITE_MQTT_PORT=8080 VITE_MQTT_SSL=false \ No newline at end of file diff --git a/frontend/vju_display/src/App.vue b/frontend/vju_display/src/App.vue index d2a3ee0..fd2c0bf 100644 --- a/frontend/vju_display/src/App.vue +++ b/frontend/vju_display/src/App.vue @@ -5,6 +5,7 @@ import ProjManualPage from './components/pages/ProjManualPage.vue'; import VerticalTabs from './components/tabs/VerticalTabs.vue'; import Tab from './components/tabs/Tab.vue'; import LightingPage from './components/pages/LightingPage.vue'; +import ServisPage from './components/pages/ServisPage.vue'; let urlParams = new URLSearchParams(window.location.search); @@ -38,7 +39,9 @@ const pageNum = ref(0) // TODO spremen na 0 <MainPage v-if="pageNum == 0" /> <ProjManualPage v-else-if="pageNum == 1" :room="currentRoom" /> - <LightingPage v-else-if="pageNum == 3" :room="currentRoom"/> + <LightingPage v-else-if="pageNum == 3" :room="currentRoom" /> + + <ServisPage v-else-if="pageNum == 4" :room="currentRoom" /> </main> </div> </template> diff --git a/frontend/vju_display/src/components/Lift.vue b/frontend/vju_display/src/components/Lift.vue new file mode 100644 index 0000000..8dea428 --- /dev/null +++ b/frontend/vju_display/src/components/Lift.vue @@ -0,0 +1,125 @@ +<script setup lang="ts"> +//import HelloWorld from './components/HelloWorld.vue' +//import TheWelcome from './components/TheWelcome.vue' +import {ref, onMounted, reactive } from 'vue' +import { $mqtt } from 'vue-paho-mqtt' +import DownIcon from './icons/DownIcon.vue'; +import UpIcon from './icons/UpIcon.vue'; + +const props = defineProps({ + room: String, + position: String +}) + +const topicstrs = [ //TODO everything else + props.room + '/projectors/' + props.position + 'lift/status', + props.room + '/projectors/' + props.position + 'lift/status', +] + +const subscriptions = +topicstrs.map(topic => { + // console.log('subbing to', topic) + $mqtt.subscribe(topic, (msg) => { + // console.log('received:', topic, msg) + handleIncomingMQTT(topic, msg) + }) +}) + +function handleIncomingMQTT(topic: string, msg: string) { + console.log('Received on', topic, 'with message', msg) + if (topic.includes('status')) { + //console.log(topic.split('/')) + let typ = topic.split('/')[4] + // handlePlatnoStatus(msg) + } +} + +// enum firankState { +// UP, +// DOWN, +// MOVING, +// STOPPED +// } +// const firankStatus = ref(firankState.STOPPED) + +// function handlePlatnoStatus(msg: string) { +// console.log('handling status') +// //console.log(projStatus) +// let newState: firankState +// switch (msg) { +// case "UP": +// newState = firankState.UP +// break +// case "DOWN": +// newState = firankState.DOWN +// break +// case "MOVING": +// newState = firankState.MOVING +// break +// default: +// newState = firankState.STOPPED +// break +// } +// firankStatus.value = newState +// } + +onMounted(() => { + // console.log('test') + //$mqtt.publish('peepee', 'poopoo', 'Qr') // dela + +}) + +function publishMQTTMsg(topic: string, msg: string) { + //msg = msg.toString() + console.log('Sending to [', topic, '] with message [', msg, ']') + $mqtt.publish(topic, msg, 'Qr') //todo refactor to 1 or 0 maybe + console.log('sent') +} +const publishPrefix = ref(props.room + '/projectors/' + props.position + '/lift/') + + +</script> + +<!-- +TODO: NE HARDCODANO +--> + +<template> + <div style="display:flex; gap: 1rem"> + <div> + <h4>Lifti {{ props.position }}</h4> + + <button + @mousedown="publishMQTTMsg(publishPrefix + 'move/up', '1')" + @mouseup="publishMQTTMsg(publishPrefix + 'move/up', '0')" > + <UpIcon /></button> + <button + @mousedown="publishMQTTMsg(publishPrefix + 'move/down', '1')" + @mouseup="publishMQTTMsg(publishPrefix + 'move/down', '0')" > + <DownIcon /></button> + </div><div> + <h4>Servis lifti {{ props.position }}</h4> + + <button + @mousedown="publishMQTTMsg(publishPrefix + 'move/service_up', '1')" + @mouseup="publishMQTTMsg(publishPrefix + 'move/service_up', '0')" > + <UpIcon /></button> + <button + @mousedown="publishMQTTMsg(publishPrefix + 'move/service_down', '1')" + @mouseup="publishMQTTMsg(publishPrefix + 'move/service_down', '0')" > + <DownIcon /></button> + </div> + </div> +</template> + +<style scoped> +.disabled { + opacity: .8; + pointer-events: none; +} +button { + padding: 1rem; + margin: 0.1rem; + width: 45%; +} +</style> diff --git a/frontend/vju_display/src/components/pages/LightingPage.vue b/frontend/vju_display/src/components/pages/LightingPage.vue index 3f18429..e49e52a 100644 --- a/frontend/vju_display/src/components/pages/LightingPage.vue +++ b/frontend/vju_display/src/components/pages/LightingPage.vue @@ -107,6 +107,7 @@ const publishPrefix = ref(props.room + '/firanki/') } button { padding: 1rem; - width: 50%; + margin: 0.1rem; + width: 45%; } </style> diff --git a/frontend/vju_display/src/components/pages/ServisPage.vue b/frontend/vju_display/src/components/pages/ServisPage.vue new file mode 100644 index 0000000..ddc88fa --- /dev/null +++ b/frontend/vju_display/src/components/pages/ServisPage.vue @@ -0,0 +1,36 @@ +<script setup lang="ts"> +//import HelloWorld from './components/HelloWorld.vue' +//import TheWelcome from './components/TheWelcome.vue' +import {ref, onMounted, reactive } from 'vue' +import { $mqtt } from 'vue-paho-mqtt' +// import Projektor from '../Projektor.vue' +// import Platno from '../Platno.vue' +import Lift from '../Lift.vue'; + +const props = defineProps({ + room: String, +}) +const _glavni_position = ref('glavni') +const _stranski_position = ref('stranski') + +</script> + +<template> + <div style="display: flex; gap: 1rem"> + <div> + <Lift :room="props.room" :position="_glavni_position" /> + <!-- <Projektor :room="props.room" :position="_glavni_position" /> --> + <!-- <Platno :room="props.room" :position="_glavni_position" /> --> + + </div> + <div> + <Lift :room="props.room" :position="_stranski_position" /> + <!-- <Projektor :room="props.room" :position="_stranski_position" /> --> + <!-- <Platno :room="props.room" :position="_stranski_position" /> --> + </div> + </div> +</template> + +<style scoped> + +</style> diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..d1e88ee --- /dev/null +++ b/poetry.lock @@ -0,0 +1,154 @@ +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. + +[[package]] +name = "aiomqtt" +version = "2.3.0" +description = "The idiomatic asyncio MQTT client, wrapped around paho-mqtt" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "aiomqtt-2.3.0-py3-none-any.whl", hash = "sha256:127926717bd6b012d1630f9087f24552eb9c4af58205bc2964f09d6e304f7e63"}, + {file = "aiomqtt-2.3.0.tar.gz", hash = "sha256:312feebe20bc76dc7c20916663011f3bd37aa6f42f9f687a19a1c58308d80d47"}, +] + +[package.dependencies] +paho-mqtt = ">=2.1.0,<3.0.0" + +[[package]] +name = "aioserial" +version = "1.3.1" +description = "An asynchronous serial port library of Python" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "aioserial-1.3.1.tar.gz", hash = "sha256:702bf03b0eb84b8ef2d8dac5cb925e1e685dce98f77b125569bc6fd2b3b58228"}, +] + +[package.dependencies] +pyserial = "*" + +[[package]] +name = "colorzero" +version = "2.0" +description = "Yet another Python color library" +optional = false +python-versions = "*" +files = [ + {file = "colorzero-2.0-py2.py3-none-any.whl", hash = "sha256:0e60d743a6b8071498a56465f7719c96a5e92928f858bab1be2a0d606c9aa0f8"}, + {file = "colorzero-2.0.tar.gz", hash = "sha256:e7d5a5c26cd0dc37b164ebefc609f388de24f8593b659191e12d85f8f9d5eb58"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +doc = ["pkginfo", "sphinx", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "gpiozero" +version = "2.0.1" +description = "A simple interface to GPIO devices with Raspberry Pi" +optional = false +python-versions = ">=3.9" +files = [ + {file = "gpiozero-2.0.1-py3-none-any.whl", hash = "sha256:8f621de357171d574c0b7ea0e358cb66e560818a47b0eeedf41ce1cdbd20c70b"}, + {file = "gpiozero-2.0.1.tar.gz", hash = "sha256:d4ea1952689ec7e331f9d4ebc9adb15f1d01c2c9dcfabb72e752c9869ab7e97e"}, +] + +[package.dependencies] +colorzero = "*" + +[package.extras] +doc = ["sphinx (>=4.0)", "sphinx-rtd-theme (>=1.0)"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "paho-mqtt" +version = "2.1.0" +description = "MQTT version 5.0/3.1.1 client class" +optional = false +python-versions = ">=3.7" +files = [ + {file = "paho_mqtt-2.1.0-py3-none-any.whl", hash = "sha256:6db9ba9b34ed5bc6b6e3812718c7e06e2fd7444540df2455d2c51bd58808feee"}, + {file = "paho_mqtt-2.1.0.tar.gz", hash = "sha256:12d6e7511d4137555a3f6ea167ae846af2c7357b10bc6fa4f7c3968fc1723834"}, +] + +[package.extras] +proxy = ["pysocks"] + +[[package]] +name = "pyserial" +version = "3.5" +description = "Python Serial Port Extension" +optional = false +python-versions = "*" +files = [ + {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, + {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, +] + +[package.extras] +cp2110 = ["hidapi"] + +[[package]] +name = "setuptools" +version = "75.6.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.9" +files = [ + {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, + {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] +core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] + +[[package]] +name = "smbus2" +version = "0.5.0" +description = "smbus2 is a drop-in replacement for smbus-cffi/smbus-python in pure Python" +optional = false +python-versions = "*" +files = [ + {file = "smbus2-0.5.0-py2.py3-none-any.whl", hash = "sha256:1a15c3b9fa69357beb038cc0b5d37939702f8bfde1ddc89ca9f17d8461dbe949"}, + {file = "smbus2-0.5.0.tar.gz", hash = "sha256:4a5946fd82277870c2878befdb1a29bb28d15cda14ea4d8d2d54cf3d4bdcb035"}, +] + +[package.extras] +docs = ["sphinx (>=1.5.3)"] +qa = ["flake8"] + +[[package]] +name = "telnetlib3" +version = "2.0.4" +description = "Python 3 asyncio Telnet server and client Protocol library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "telnetlib3-2.0.4-py2.py3-none-any.whl", hash = "sha256:b3c0f984a7fb1b6ee16e6fdaa410c56389b0dc492174a99c6661b1ba4c9d457d"}, + {file = "telnetlib3-2.0.4.tar.gz", hash = "sha256:dbcbc16456a0e03a62431be7cfefff00515ab2f4ce2afbaf0d3a0e51a98c948d"}, +] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "5e30fcfae3a69f8475da0f4ba655b5194a80b2a2185c652cbce2c72fa83aa752" diff --git a/projector_motors/projector_motors.py b/projector_motors/projector_motors.py index 0d395be..eeb45b1 100644 --- a/projector_motors/projector_motors.py +++ b/projector_motors/projector_motors.py @@ -1,62 +1,98 @@ -import gpiozero.pins.mock -from gpiozero import * +#import gpiozero.pins.mock +#from gpiozero import * +#from grove.factory import Factory +#from grove.grove_relay import GroveRelay import aiomqtt import asyncio +#from i2cpy import I2C +from smbus2 import SMBus +#import i2cpy +#i2cset -y 1 0x11 0x11 0x42 +#set i2c address from 0x11 to 0x42 # ONLY FOR TESTING ON NON RPI -Device.pin_factory = gpiozero.pins.mock.MockFactory() +#Device.pin_factory = gpiozero.pins.mock.MockFactory() -relays = [LED(17), LED(27), LED(22), LED(23), LED(5), LED(6), LED(24), LED(25)] +#relays = [LED(17), LED(27), LED(22), LED(23), LED(5), LED(6), LED(24), LED(25)] +relayBoardMain = 0x42 +relayBoardSide = 0x43 +""" 0 1 2 3 """ +relayMasks = [0b0001, 0b0010, 0b0100, 0b1000] #probably ne rabim +bus = SMBus(1) + +relMapping = { + 'service_down': 0, + 'service_up': 1, + 'down': 2, + 'up': 3 +} + +currentState = { + 'glavni': 0b0000, + 'stranski': 0b0000 +} + +async def msgRelayBoard(projSelect, command, state: bool): + #i2cAddr = relayBoardMain if projSelect == 'glavni' else relayBoardSide + #TODO this is not optimal, check for more crap + + # register 0x10 za releje + + I2CAddr = 0x42 #glavni + if projSelect == 'stranski': + I2CAddr += 0x1 + + maskShift = relMapping[command] + mask = (1 << maskShift) + if state: + currentState[projSelect] = currentState[projSelect] | mask + else: + currentState[projSelect] = currentState[projSelect] & ~mask + + bus.write_byte_data(I2CAddr, 0x10, currentState[projSelect]) + + print('testirovano jako') + + +""" + SrvDwn SrvUp OpDwn OpUp +MAIN: 0x42 0001 0010 0100 1000 +SIDE: 0x43 0001 0010 0100 1000 +""" + + +#old board """ MAIN: SrvDwn SrvUp OpDwn OpUp 0 1 2 3 SIDE: 4 5 6 7 """ +#dej like bolsĖ to podukumentiraj or smth 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) + #relayCtrl = lambda cmd, relay: [relays[r].on() if cmd == 1 and r == relay else relays[r].off for r in range(len(relays))] + + relayCtrl = lambda x, y: print(x, y) + await controlClient.subscribe("p01/projectors/+/lift/#") + msgs = controlClient.messages + async for mesg in msgs: + mesg: aiomqtt.Message + if mesg.topic.matches('p01/projectors/+/lift/move/#'): + msgTopicArr = mesg.topic.value.split('/') + state = mesg.payload.decode() + print("Received: " + str(msgTopicArr) + " payload: [" + state + "]") + #testCase = (msgTopicArr[2], msgTopicArr[4]) + projSel = msgTopicArr[2] + if projSel != 'glavni' and projSel != 'stranski': + continue + command = msgTopicArr[5] + await msgRelayBoard(projSel, command, state == '1') + + #print("Pushing \'off\' to other relays to prevent conflicts") + await asyncio.sleep(0.01) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..603f6ec --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,21 @@ +[tool.poetry] +name = "fri-mm-maline" +version = "0.1.0" +description = "" +authors = ["Your Name <you@example.com>"] +license = "GPLv3" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +aiomqtt = "^2.3.0" +aioserial = "^1.3.1" +gpiozero = "^2.0.1" +telnetlib3 = "^2.0.4" +toml = "^0.10.2" +smbus2 = "^0.5.0" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/tse_serial/tse_serial_controler.py b/tse_serial/tse_serial_controler.py index fd352b4..2b11a22 100644 --- a/tse_serial/tse_serial_controler.py +++ b/tse_serial/tse_serial_controler.py @@ -7,14 +7,14 @@ from dataclasses import dataclass room = 'p01' #TODO make be do get fronm file of configuration -# aser: aioserial.AioSerial = aioserial.AioSerial( -# port='/dev/cu.usbserial-14240', #TODO not hardcode it -# baudrate=1200, -# parity=serial.PARITY_NONE, -# bytesize=serial.EIGHTBITS, -# stopbits=serial.STOPBITS_ONE -# ) -# TODO adjust serial on actual TSE interface +aser: aioserial.AioSerial = aioserial.AioSerial( + port='/dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller_D-if00-port0', + #id say not hardcode it ampak kinda nimamo izbire + baudrate=1200, + parity=serial.PARITY_NONE, + bytesize=serial.EIGHTBITS, + stopbits=serial.STOPBITS_ONE + ) #TODO get this from file da ni hardcoded @@ -41,9 +41,11 @@ shades_mapping = { } #reverse_lookup = {v: k for k, v in mapping.items()} #fujto -# TODO simple reverse lookup za ko kripa pove kaj +# TODO simple reverse lookup za ko kripa pove kaj +# in vse tole + async def task_status2mqtt(statusClient: aiomqtt.Client): while True: #data = await aser.read_until_async() @@ -71,7 +73,7 @@ async def executeAndPublish(mqttClient, pubTopic, pubPayload, relStat): print("Sending to TSE box: " + setRelayCmd) print(f"Also publishing topic [{pubTopic}] with status [{pubPayload}]") print() - #await aser.write_async(bytes(setRelayCmd + '\r\n', "ascii")) + await aser.write_async(bytes(setRelayCmd + '\r\n', "ascii")) await mqttClient.publish(pubTopic, payload=pubPayload)