From 595b94a8965964e32513250f8c768206124f19cb Mon Sep 17 00:00:00 2001 From: Jarno Rankinen Date: Sun, 15 Jan 2023 23:32:49 +0200 Subject: [PATCH] PUT /api/v1/coils/ to flip a coil --- enervent-ctrl-python/src/EnerventCoils.py | 18 ++++++++++++++---- enervent-ctrl-python/src/enervent-logger.py | 11 ++++------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/enervent-ctrl-python/src/EnerventCoils.py b/enervent-ctrl-python/src/EnerventCoils.py index be006ee..bf4ab78 100644 --- a/enervent-ctrl-python/src/EnerventCoils.py +++ b/enervent-ctrl-python/src/EnerventCoils.py @@ -6,13 +6,13 @@ class EnerventCoil(): """Single coil data structure""" def __init__(self, symbol="reserved", description="reserved"): self.symbol = symbol - self.value = 0 + self.value = False self.description = description self.reserved = symbol == "reserved" and description == "reserved" def serialize(self): return { - "value": self.value == 1, + "value": self.value, "symbol": self.symbol, "description": self.description, "reserved": self.reserved @@ -21,6 +21,9 @@ class EnerventCoil(): def get(self): return jsonify(self.serialize()) + def flip(self): + self.value = not self.value + class Coils(): """Class for handling Modbus coils""" coillogger = logging.getLogger(__name__) @@ -121,14 +124,14 @@ class Coils(): if debug: self.coillogger.info(f"{len(self.coils)} coils registered") curvalues = self.pingvin.read_bits(0,len(self.coils),1) for i, coil in enumerate(self.coils): - self.coils[i].value = curvalues[i] + self.coils[i].value = bool(curvalues[i]) if debug: self.coillogger.info("Coil values read succesfully") def fetchValue(self, address, debug=False): """Update single coil value from device and return it""" self.pingvin.debug = debug if debug: self.coillogger.debug("Updating coil value from device to cache") - self.coils[address].value = self.pingvin.read_bit(address, 1) + self.coils[address].value = bool(self.pingvin.read_bit(address, 1)) return self.value(address, debug) def value(self, address, debug=False): @@ -158,6 +161,13 @@ class Coils(): if live: self.update(debug) return jsonify(self.serialize(include_reserved)) + def write(self, address): + self.pingvin.write_bit(address, int(not self.coils[address].value)) + if self.pingvin.read_bit(address, 1) != self.coils[address].value: + self.coils[address].flip() + return True + return False + class PingvinKL(): """Class for communicating with an Enervent Pinvin Kotilämpö ventilation/heating unit""" def __init__(self, serialdevice='/dev/ttyS0', modbusaddr=1, debug=False): diff --git a/enervent-ctrl-python/src/enervent-logger.py b/enervent-ctrl-python/src/enervent-logger.py index dac413d..37d37a3 100755 --- a/enervent-ctrl-python/src/enervent-logger.py +++ b/enervent-ctrl-python/src/enervent-logger.py @@ -4,7 +4,7 @@ from EnerventCoils import PingvinKL from flask import Flask, request VERSION = "0.0.1" -DEBUG = False +DEBUG = True ## Logging configuration log = logging.getLogger(__name__) @@ -24,15 +24,12 @@ def get_all(): @app.route('/api/v1/coils/', methods=["GET","PUT"]) def coil(address): if request.method == 'GET': - coil = pingvin.coils[address].get(debug=DEBUG) + coil = pingvin.coils[address].get() return coil - elif request.method == 'POST': - return False + elif request.method == 'PUT': + return {"success": pingvin.coils.write(address)} if __name__ == "__main__": log.info(f"Starting enervent-logger {VERSION}") - # print(pingvin.coils.value(1, debug=DEBUG)) - # print(pingvin.coils.fetchValue(1, debug=DEBUG)) - # print(pingvin.coils.print()) app.run(host='0.0.0.0',port=8888,debug=DEBUG)