@@ -25,5 +25,5 @@ jobs:
|
||||
export EPICS_CAS_INTF_ADDR_LIST="127.0.0.1 localhost";
|
||||
export EPICS_CA_ADDR_LIST="127.0.0.1 localhost";
|
||||
export EPICS_CA_SERVER_PORT=5064;
|
||||
source testenv/bin/activate && python3 tests/test.py
|
||||
source testenv/bin/activate && python3 test/test.py
|
||||
|
||||
@@ -2,16 +2,17 @@
|
||||
|
||||
An EPICS driver based on StreamDevice allowing to control remotely both ePowerSwitch 4 IEC and 8M+
|
||||
|
||||
# How to use
|
||||
|
||||
Before any execution, look at startioc.sh.
|
||||
|
||||
It will show you any environment variables you need to see.
|
||||
|
||||
After setting up environment variables, you can start by executing
|
||||
# How to install
|
||||
|
||||
```bash
|
||||
$ startioc.sh
|
||||
git clone https://gitea.psi.ch/lin-epics-modules/ePowerSwitch && make install
|
||||
```
|
||||
|
||||
# How to use
|
||||
|
||||
To start the IOCSH,
|
||||
```bash
|
||||
$ ./startioc.sh
|
||||
```
|
||||
|
||||
# Documentation
|
||||
@@ -27,8 +28,8 @@ By default, it should be called
|
||||
```
|
||||
ePowerSwitch_set_outlet_1
|
||||
ePowerSwitch_set_outlet_2
|
||||
ePowerSwitch_set_outlet_3
|
||||
ePowerSwitch_set_outlet_4
|
||||
...
|
||||
ePowerSwitch_set_outlet_n
|
||||
```
|
||||
|
||||
## Getters
|
||||
@@ -42,8 +43,8 @@ By default, it should be called
|
||||
```
|
||||
ePowerSwitch_get_outlet_1
|
||||
ePowerSwitch_get_outlet_2
|
||||
ePowerSwitch_get_outlet_3
|
||||
ePowerSwitch_get_outlet_4
|
||||
...
|
||||
ePowerSwitch_get_outlet_n
|
||||
```
|
||||
|
||||
Furthermore, a record exposes the number of sockets of this device:
|
||||
@@ -58,12 +59,59 @@ By default, it should be called
|
||||
ePowerSwitch_config_maxOutlet
|
||||
```
|
||||
|
||||
# Simulator
|
||||
|
||||
the subfolder 'sim' containt a simulator of the real device
|
||||
|
||||
To start it:
|
||||
|
||||
```bash
|
||||
sh maketestenv.sh && source testenv/bin/activate && python3 sim/ePowerSwitch8_sim.py
|
||||
```
|
||||
|
||||
# Test
|
||||
|
||||
A CI pipeline is setup
|
||||
|
||||
To manually start tests
|
||||
|
||||
```bash
|
||||
sh maketestenv.sh && source testenv/bin/activate && python3 test/test.py
|
||||
```
|
||||
|
||||
# User guide
|
||||
|
||||
- [ePowerSwitch 4 IEC](https://www.kvm-concepts.de/wp-content/uploads/neol_epowerswitch_4iec_manual.pdf)
|
||||
|
||||
- [ePowerSwitch 8M+](https://www.neol.com/fileadmin/downloads/en/ePowerSwitch-8M-Plus-EN.pdf)
|
||||
- [ePowerSwitch 8M+](https://www.neol.com/fileadmin/downloads/en/ePowerSwitch-8M-Plus-EN.pdf)
|
||||
|
||||
# Preview
|
||||
|
||||
This is the setup of all epics records for a 4 outlet device
|
||||
|
||||

|
||||
|
||||
## outlet_init
|
||||
|
||||
This record initially attempts to fetch the current state of all outlets to initialize each `set_outlet_x` record with its current value.
|
||||
|
||||
## init_x
|
||||
|
||||
These records overwrite the current value of all `set_outlet_x` records to match the actual initial state of the outlets.
|
||||
|
||||
## set_outlet_x
|
||||
|
||||
These records allow commands to be sent to the device by writing to them.
|
||||
Acceptable states are: `{ OFF, ON, RESTART }`
|
||||
|
||||
## outlet_getter
|
||||
|
||||
This record fetches the state of the device's outlets and stores these values into its own fields.
|
||||
|
||||
## get_outlet_x
|
||||
|
||||
This record can be read to retrieve the current state of a specific outlet.
|
||||
|
||||
## config_maxOutlet
|
||||
|
||||
This record allows users to easily determine how many outlets are present on the device.
|
||||
@@ -1,22 +0,0 @@
|
||||
from caproto.sync.client import read, write
|
||||
from time import sleep
|
||||
|
||||
class CaprotoWrapper:
|
||||
def raw_read(pvname):
|
||||
return read(pvname, timeout=5).data[0].decode('utf-8')
|
||||
|
||||
def get_pv_value(pvname, expected_value):
|
||||
timeout = 10
|
||||
while(expected_value != CaprotoWrapper.raw_read(pvname) and timeout > 0):
|
||||
timeout -=1
|
||||
sleep(0.5)
|
||||
|
||||
return CaprotoWrapper.raw_read(pvname)
|
||||
|
||||
def set_pv_value(pvname, value):
|
||||
write(pvname, value, notify=True)
|
||||
timeout = 10
|
||||
while(value != CaprotoWrapper.raw_read(pvname) and timeout > 0):
|
||||
timeout -= 1
|
||||
sleep(0.5)
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
import subprocess
|
||||
import sys
|
||||
import signal
|
||||
|
||||
from caproto_wrapper import CaprotoWrapper
|
||||
|
||||
def is_ioc_running():
|
||||
return "" != CaprotoWrapper.raw_read("ePowerSwitch_set_outlet_1")
|
||||
|
||||
def start_iocshell():
|
||||
res = subprocess.Popen(["./startioc.sh"])
|
||||
while not is_ioc_running():
|
||||
pass
|
||||
return res
|
||||
|
||||
def start_sim():
|
||||
return subprocess.Popen(["python", "./sim/ePowerSwitch8_sim.py"])
|
||||
|
||||
def start_pytest():
|
||||
return subprocess.Popen(["pytest","tests"])
|
||||
|
||||
sim_process = start_sim()
|
||||
iocsh_process = start_iocshell()
|
||||
pytest_process = start_pytest()
|
||||
exit_code = 0
|
||||
|
||||
try:
|
||||
|
||||
exit_code = pytest_process.wait()
|
||||
|
||||
finally:
|
||||
sim_process.send_signal(sig=signal.SIGTERM)
|
||||
iocsh_process.send_signal(sig=signal.SIGTERM)
|
||||
pytest_process.send_signal(sig=signal.SIGTERM)
|
||||
|
||||
sys.exit(exit_code)
|
||||
@@ -1,119 +0,0 @@
|
||||
from caproto_wrapper import CaprotoWrapper
|
||||
|
||||
delay = 1
|
||||
|
||||
def test_turn_on():
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_1", "On")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_1", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_1", "On") == "On")
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_2", "On")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_2", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_2", "On") == "On")
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_3", "On")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_3", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_3", "On") == "On")
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_4", "On")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_4", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_4", "On") == "On")
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_5", "On")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_5", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_5", "On") == "On")
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_6", "On")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_6", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_6", "On") == "On")
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_7", "On")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_7", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_7", "On") == "On")
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_8", "On")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_8", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_8", "On") == "On")
|
||||
|
||||
|
||||
|
||||
def test_turn_off():
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_1", "Off")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_1", "Off") == "Off")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_1", "Off") == "Off")
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_2", "Off")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_2", "Off") == "Off")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_2", "Off") == "Off")
|
||||
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_3", "Off")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_3", "Off") == "Off")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_3", "Off") == "Off")
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_4", "Off")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_4", "Off") == "Off")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_4", "Off") == "Off")
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_5", "Off")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_5", "Off") == "Off")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_5", "Off") == "Off")
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_6", "Off")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_6", "Off") == "Off")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_6", "Off") == "Off")
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_7", "Off")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_7", "Off") == "Off")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_7", "Off") == "Off")
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_8", "Off")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_8", "Off") == "Off")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_8", "Off") == "Off")
|
||||
|
||||
|
||||
|
||||
def test_restart():
|
||||
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_1", "Restart")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_1", "Rst") == "Rst")
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_2", "Restart")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_2", "Rst") == "Rst")
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_3", "Restart")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_3", "Rst") == "Rst")
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_4", "Restart")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_4", "Rst") == "Rst")
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_5", "Restart")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_5", "Rst") == "Rst")
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_6", "Restart")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_6", "Rst") == "Rst")
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_7", "Restart")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_7", "Rst") == "Rst")
|
||||
CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_8", "Restart")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_8", "Rst") == "Rst")
|
||||
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_1", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_2", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_3", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_4", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_5", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_6", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_7", "On") == "On")
|
||||
assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_8", "On") == "On")
|
||||
|
||||
Reference in New Issue
Block a user