PUT /api/v1/coils/<int:address> to flip a coil

This commit is contained in:
Jarno Rankinen 2023-01-15 23:32:49 +02:00
parent 609ae0b97f
commit 595b94a896
2 changed files with 18 additions and 11 deletions

View File

@ -6,13 +6,13 @@ class EnerventCoil():
"""Single coil data structure""" """Single coil data structure"""
def __init__(self, symbol="reserved", description="reserved"): def __init__(self, symbol="reserved", description="reserved"):
self.symbol = symbol self.symbol = symbol
self.value = 0 self.value = False
self.description = description self.description = description
self.reserved = symbol == "reserved" and description == "reserved" self.reserved = symbol == "reserved" and description == "reserved"
def serialize(self): def serialize(self):
return { return {
"value": self.value == 1, "value": self.value,
"symbol": self.symbol, "symbol": self.symbol,
"description": self.description, "description": self.description,
"reserved": self.reserved "reserved": self.reserved
@ -21,6 +21,9 @@ class EnerventCoil():
def get(self): def get(self):
return jsonify(self.serialize()) return jsonify(self.serialize())
def flip(self):
self.value = not self.value
class Coils(): class Coils():
"""Class for handling Modbus coils""" """Class for handling Modbus coils"""
coillogger = logging.getLogger(__name__) coillogger = logging.getLogger(__name__)
@ -121,14 +124,14 @@ class Coils():
if debug: self.coillogger.info(f"{len(self.coils)} coils registered") if debug: self.coillogger.info(f"{len(self.coils)} coils registered")
curvalues = self.pingvin.read_bits(0,len(self.coils),1) curvalues = self.pingvin.read_bits(0,len(self.coils),1)
for i, coil in enumerate(self.coils): 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") if debug: self.coillogger.info("Coil values read succesfully")
def fetchValue(self, address, debug=False): def fetchValue(self, address, debug=False):
"""Update single coil value from device and return it""" """Update single coil value from device and return it"""
self.pingvin.debug = debug self.pingvin.debug = debug
if debug: self.coillogger.debug("Updating coil value from device to cache") 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) return self.value(address, debug)
def value(self, address, debug=False): def value(self, address, debug=False):
@ -158,6 +161,13 @@ class Coils():
if live: self.update(debug) if live: self.update(debug)
return jsonify(self.serialize(include_reserved)) 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 PingvinKL():
"""Class for communicating with an Enervent Pinvin Kotilämpö ventilation/heating unit""" """Class for communicating with an Enervent Pinvin Kotilämpö ventilation/heating unit"""
def __init__(self, serialdevice='/dev/ttyS0', modbusaddr=1, debug=False): def __init__(self, serialdevice='/dev/ttyS0', modbusaddr=1, debug=False):

View File

@ -4,7 +4,7 @@ from EnerventCoils import PingvinKL
from flask import Flask, request from flask import Flask, request
VERSION = "0.0.1" VERSION = "0.0.1"
DEBUG = False DEBUG = True
## Logging configuration ## Logging configuration
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -24,15 +24,12 @@ def get_all():
@app.route('/api/v1/coils/<int:address>', methods=["GET","PUT"]) @app.route('/api/v1/coils/<int:address>', methods=["GET","PUT"])
def coil(address): def coil(address):
if request.method == 'GET': if request.method == 'GET':
coil = pingvin.coils[address].get(debug=DEBUG) coil = pingvin.coils[address].get()
return coil return coil
elif request.method == 'POST': elif request.method == 'PUT':
return False return {"success": pingvin.coils.write(address)}
if __name__ == "__main__": if __name__ == "__main__":
log.info(f"Starting enervent-logger {VERSION}") 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) app.run(host='0.0.0.0',port=8888,debug=DEBUG)