1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
from flask import Flask, jsonify
import serial
import os
app = Flask(__name__)
RELAY_DEV = os.environ.get("RELAYCTL_DEV", "/dev/ttyUSB0")
RELAY_HOST = os.environ.get("RELAYCTL_HOST", "127.0.0.1")
RELAY_PORT = os.environ.get("RELAYCTL_PORT", "5050")
RELAY_BAUD = 9600
RELAY_ID = 1 # NOTE: multi relay boards are not supported (only relay id 1)
def get_cmd(state: bool):
"""
LCUS relay 4-byte control command syntax is as follows:
start: always 0xA0
relay: id of relay (counts from 1)
state: coil energized 0 or 1
checksum: sum of previous 3 bytes
"""
start = 0xA0
relay = RELAY_ID
state = int(state)
checksum = start + relay + state
return bytes((start, relay, state, checksum))
def get_serial():
return serial.Serial(RELAY_DEV, RELAY_BAUD, timeout=1)
@app.route("/on", methods=["GET", "POST"])
def on():
with get_serial() as ser:
ser.write(get_cmd(True))
return jsonify({"state": "ON"})
@app.route("/off", methods=["GET", "POST"])
def off():
with get_serial() as ser:
ser.write(get_cmd(False))
return jsonify({"state": "OFF"})
@app.route("/status", methods=["GET"])
def status():
with get_serial() as ser:
ser.write(bytes((0xFF,))) # write 0xFF to get status
r = ser.readline()
state = r.decode("utf-8").removeprefix("CH1: ").strip()
return jsonify({"state": state})
def main():
app.run(host=RELAY_HOST, port=int(RELAY_PORT))
if __name__ == "__main__":
main()
|