Added support for 4 Relay + 4 Opto isolated inputs
parent
5c1e3d3fac
commit
5ec90c314f
|
@ -1 +1,2 @@
|
||||||
MODULE_RTD8_LEVELS=01234567 #number of stack level (0-7) not separated
|
MODULE_RTD8_LEVELS=01234567 #number of stack level (0-7) not separated
|
||||||
|
MODULE_REL4HVI4_LEVELS=01234567 #number of stack level (0-7) not separated
|
17
README.md
17
README.md
|
@ -1,3 +1,20 @@
|
||||||
# SequentMicrosystems_API
|
# SequentMicrosystems_API
|
||||||
|
|
||||||
API for sequent microsystems boards running on RaspberryPI
|
API for sequent microsystems boards running on RaspberryPI
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
35
pdm.lock
35
pdm.lock
|
@ -5,7 +5,7 @@
|
||||||
groups = ["default"]
|
groups = ["default"]
|
||||||
strategy = ["cross_platform", "inherit_metadata"]
|
strategy = ["cross_platform", "inherit_metadata"]
|
||||||
lock_version = "4.5.0"
|
lock_version = "4.5.0"
|
||||||
content_hash = "sha256:f4f1e2189c6ffd6d794a2407d788e6716784556dfe8717566ece8e4c48e157e7"
|
content_hash = "sha256:a386b1448f475cfd997f505d3dc55da73a888f9be06306adbabb701440ec7aa3"
|
||||||
|
|
||||||
[[metadata.targets]]
|
[[metadata.targets]]
|
||||||
requires_python = ">=3.12"
|
requires_python = ">=3.12"
|
||||||
|
@ -68,15 +68,6 @@ files = [
|
||||||
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
|
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "dotenv"
|
|
||||||
version = "0.0.5"
|
|
||||||
summary = "Handle .env files"
|
|
||||||
groups = ["default"]
|
|
||||||
files = [
|
|
||||||
{file = "dotenv-0.0.5.tar.gz", hash = "sha256:b58d2ab3f83dbd4f8a362b21158a606bee87317a9444485566b3c8f0af847091"},
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fastapi"
|
name = "fastapi"
|
||||||
version = "0.115.5"
|
version = "0.115.5"
|
||||||
|
@ -193,6 +184,30 @@ files = [
|
||||||
{file = "pydantic_core-2.27.0.tar.gz", hash = "sha256:f57783fbaf648205ac50ae7d646f27582fc706be3977e87c3c124e7a92407b10"},
|
{file = "pydantic_core-2.27.0.tar.gz", hash = "sha256:f57783fbaf648205ac50ae7d646f27582fc706be3977e87c3c124e7a92407b10"},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "python-dotenv"
|
||||||
|
version = "1.0.1"
|
||||||
|
requires_python = ">=3.8"
|
||||||
|
summary = "Read key-value pairs from a .env file and set them as environment variables"
|
||||||
|
groups = ["default"]
|
||||||
|
files = [
|
||||||
|
{file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
|
||||||
|
{file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sm4relind"
|
||||||
|
version = "1.0.3"
|
||||||
|
summary = "A set of functions to control Sequent Microsystems 4-Relay board"
|
||||||
|
groups = ["default"]
|
||||||
|
dependencies = [
|
||||||
|
"smbus2",
|
||||||
|
]
|
||||||
|
files = [
|
||||||
|
{file = "SM4relind-1.0.3-py2.py3-none-any.whl", hash = "sha256:1308f580d05893f481b79c055dfb5572bbce992777edeee6292c91c707a73a55"},
|
||||||
|
{file = "sm4relind-1.0.3.tar.gz", hash = "sha256:aa1c464f6344be63f8a84fb7e51d9c683f73f696cb8fd43cb0f1171b851f7d6b"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smbus2"
|
name = "smbus2"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
|
|
|
@ -8,8 +8,9 @@ authors = [
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"fastapi>=0.115.5",
|
"fastapi>=0.115.5",
|
||||||
"uvicorn>=0.32.1",
|
"uvicorn>=0.32.1",
|
||||||
"dotenv>=0.0.5",
|
|
||||||
"SMrtd>=1.0.1",
|
"SMrtd>=1.0.1",
|
||||||
|
"SM4relind>=1.0.3",
|
||||||
|
"python-dotenv>=1.0.1",
|
||||||
]
|
]
|
||||||
requires-python = ">=3.12"
|
requires-python = ">=3.12"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
|
|
@ -1,7 +1,14 @@
|
||||||
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
from src.modules.router import router as modulesrouter
|
from src.modules.router import router as modulesrouter
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
app = FastAPI(root_path="/api")
|
app = FastAPI(root_path="/api")
|
||||||
|
|
||||||
app.include_router(router=modulesrouter)
|
app.include_router(router=modulesrouter)
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,9 @@ stacks = [int(h) for h in os.getenv("MODULE_RTD8_LEVELS", "")]
|
||||||
if not stacks:
|
if not stacks:
|
||||||
print("MODULE_RTD8_LEVELS is not set or invalid")
|
print("MODULE_RTD8_LEVELS is not set or invalid")
|
||||||
|
|
||||||
|
for i in stacks:
|
||||||
|
print(f"Configured RTD8 card: {i}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def read_temp(stack: int, channel: int) -> float | str:
|
def read_temp(stack: int, channel: int) -> float | str:
|
||||||
|
@ -15,7 +18,7 @@ def read_temp(stack: int, channel: int) -> float | str:
|
||||||
try:
|
try:
|
||||||
return librtd.get(stack, channel)
|
return librtd.get(stack, channel)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error read data from card {stack} on channel {channel} by error: {e}")
|
return -512
|
||||||
|
|
||||||
return -512
|
return -512
|
||||||
|
|
||||||
|
@ -41,7 +44,7 @@ def read_resistance(stack: int, channel: int) -> float | str:
|
||||||
try:
|
try:
|
||||||
return librtd.getRes(stack, channel)
|
return librtd.getRes(stack, channel)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error read data from card {stack} on channel {channel} by error: {e}")
|
return -512
|
||||||
|
|
||||||
return -512
|
return -512
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Card: Four Relays four HV Inputs 8-Layer Stackable HAT for Raspberry Pi - https://sequentmicrosystems.com/collections/industrial-automation/products/four-relays-four-inputs-for-raspberry-pi
|
|
@ -0,0 +1,48 @@
|
||||||
|
from fastapi import APIRouter
|
||||||
|
import src.modules.Rel4HVI4.service as service
|
||||||
|
from typing import Dict
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
router = APIRouter(prefix="/rel4hvi4", tags=["Modules --> Rel4HVI4"])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/relay/all/{state}", description="Set all relays to required state (1/0)")
|
||||||
|
def post_relay_all(state: bool):
|
||||||
|
service.set_relay_all(value=state)
|
||||||
|
|
||||||
|
@router.post("/relay/{stack}/{state}", description="Set all relays on specified card to required state (1/0)")
|
||||||
|
def post_relay_stack(stack: int, state: bool):
|
||||||
|
service.set_relay_stack(stack=stack, value=state)
|
||||||
|
|
||||||
|
@router.post("/relay/{stack}/{channel}/{state}", description="Set all relays on specified card to required state (1/0)")
|
||||||
|
def post_relay_stack(stack: int, channel, state: bool):
|
||||||
|
service.set_relay(stack=stack, relay=channel, value=state)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/relay/all", description="Get state of all relays", response_model=Dict[int, Dict[int, bool]])
|
||||||
|
def get_relay_all():
|
||||||
|
return service.read_relay_all()
|
||||||
|
|
||||||
|
@router.get("/relay/{stack}", description="Get all relays state of specified card", response_model=Dict[int, bool])
|
||||||
|
def get_relay_stack(stack: int):
|
||||||
|
return service.read_relay_stack(stack=stack)
|
||||||
|
|
||||||
|
@router.get("/relay/{stack}/{channel}", description="Get state of selected relay", response_model=bool)
|
||||||
|
def get_relay(stack: int, channel: int):
|
||||||
|
return service.read_relay(stack=stack, relay=channel)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/opto/all", description="Get input state of all opto inputs", response_model=Dict[int, Dict[int, bool]])
|
||||||
|
def get_opto_all():
|
||||||
|
return service.read_opto_all()
|
||||||
|
|
||||||
|
@router.get("/opto/{stack}", description="Get input state all opto inputs on selected card", response_model=Dict[int, bool])
|
||||||
|
def get_opto_stack(stack: int):
|
||||||
|
return service.read_opto_stack(stack=stack)
|
||||||
|
|
||||||
|
@router.get("/opto/{stack}/{channel}", description="Get state of selected input", response_model=bool)
|
||||||
|
def get_opto(stack: int, channel: int):
|
||||||
|
return service.read_opto(stack=stack, opto=channel)
|
|
@ -0,0 +1,86 @@
|
||||||
|
import lib4relind, os
|
||||||
|
from typing import Dict
|
||||||
|
|
||||||
|
|
||||||
|
stacks = [int(h) for h in os.getenv("MODULE_REL4HVI4_LEVELS", "")]
|
||||||
|
if not stacks:
|
||||||
|
print("MODULE_Rel4HVI4_LEVELS is not set or invalid")
|
||||||
|
|
||||||
|
for i in stacks:
|
||||||
|
print(f"Configured Rel4HVI4 card: {i}")
|
||||||
|
|
||||||
|
|
||||||
|
def set_relay(stack: int, relay: int, value: bool):
|
||||||
|
"""
|
||||||
|
Set specified relay to requested state
|
||||||
|
"""
|
||||||
|
if stack in stacks and 1 <= relay <= 4:
|
||||||
|
lib4relind.set_relay(stack=stack, relay=relay, value=int(value))
|
||||||
|
|
||||||
|
def set_relay_stack(stack: int, value: bool):
|
||||||
|
"""
|
||||||
|
Set all relays to requested state on specified stack/card
|
||||||
|
"""
|
||||||
|
(set_relay(stack=stack, relay=ch, value=value) for ch in range(1, 5))
|
||||||
|
|
||||||
|
def set_relay_all(value: bool):
|
||||||
|
"""
|
||||||
|
Set all relays to requested state
|
||||||
|
"""
|
||||||
|
(set_relay_stack(stack=stack, value=value) for stack in stacks)
|
||||||
|
|
||||||
|
|
||||||
|
def read_relay(stack: int, relay: int):
|
||||||
|
"""
|
||||||
|
Read specified relay state
|
||||||
|
"""
|
||||||
|
if stack in stacks and 1 <= relay <= 4:
|
||||||
|
try:
|
||||||
|
if lib4relind.get_relay(stack=stack, relay=relay) == 1:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
return False
|
||||||
|
|
||||||
|
def read_relay_stack(stack: int):
|
||||||
|
"""
|
||||||
|
Read all relays state on specified stack/card
|
||||||
|
"""
|
||||||
|
return {relay: read_relay(stack=stack, relay=relay) for relay in range(1, 5)}
|
||||||
|
|
||||||
|
def read_relay_all():
|
||||||
|
"""
|
||||||
|
Read all relays state
|
||||||
|
"""
|
||||||
|
return {stack: read_relay_stack(stack=stack) for stack in stacks}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def read_opto(stack: int, opto: int):
|
||||||
|
"""
|
||||||
|
Read specified opto input state
|
||||||
|
"""
|
||||||
|
if stack in stacks and 1 <= opto <= 4:
|
||||||
|
try:
|
||||||
|
if lib4relind.get_opto(stack=stack, channel=opto) == 1:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
return False
|
||||||
|
|
||||||
|
def read_opto_stack(stack: int):
|
||||||
|
"""
|
||||||
|
Read all opto inputs state on specified stack/card
|
||||||
|
"""
|
||||||
|
return {opto: read_opto(stack=stack, opto=opto) for opto in range(1, 5)}
|
||||||
|
|
||||||
|
def read_opto_all():
|
||||||
|
"""
|
||||||
|
Read all opto inputs state
|
||||||
|
"""
|
||||||
|
return {stack: read_opto_stack(stack=stack) for stack in stacks}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from fastapi import APIRouter
|
from fastapi import APIRouter
|
||||||
|
|
||||||
from src.modules.RTD8.router import router as RTD8Router
|
from src.modules.RTD8.router import router as RTD8Router
|
||||||
|
from src.modules.Rel4HVI4.router import router as Rel4HVI4Router
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,3 +10,4 @@ from src.modules.RTD8.router import router as RTD8Router
|
||||||
router = APIRouter(prefix="/modules")
|
router = APIRouter(prefix="/modules")
|
||||||
|
|
||||||
router.include_router(router=RTD8Router)
|
router.include_router(router=RTD8Router)
|
||||||
|
router.include_router(router=Rel4HVI4Router)
|
Loading…
Reference in New Issue