165 lines
6.1 KiB
Python
165 lines
6.1 KiB
Python
from ..core.SyslabUnit import SyslabUnit
|
|
from ..core.datatypes import CompositeMeasurement, HeatCirculationPumpMode, HeatCirculationPumpState
|
|
|
|
|
|
class Valve:
|
|
"""
|
|
Convenience class which calls methods on its associated heatswitchboard
|
|
"""
|
|
def __init__(self, label, heatswitchboard):
|
|
self.label = label
|
|
self.heatswitchboard = heatswitchboard
|
|
#TODO: Add methods
|
|
|
|
class Pump:
|
|
"""
|
|
Convenience class which calls methods on its associated heatswitchboard
|
|
"""
|
|
def __init__(self, label, heatswitchboard):
|
|
self.label = label
|
|
self.heatswitchboard = heatswitchboard
|
|
#TODO: Add methods
|
|
|
|
class Meter:
|
|
"""
|
|
Convenience class which calls methods on its associated heatswitchboard
|
|
"""
|
|
def __init__(self, label, heatswitchboard):
|
|
self.label = label
|
|
self.heatswitchboard = heatswitchboard
|
|
#TODO: Add methods
|
|
|
|
|
|
class HeatSwitchBoard(SyslabUnit):
|
|
"""
|
|
The HeatSwitchBoard class represents a HeatSwitchBoard in SYSLAB.
|
|
The HeatSwitchBoard class is instantiated using a string with the unique name of the switchboard, ie. 'which'
|
|
|
|
A full list of available switchboards can be found by calling 'SwitchBoard.getAvailableSwitchBoards()'
|
|
|
|
Alternatively, the user may specify a host and port to connect to via the *host* and *port* arguments.
|
|
"""
|
|
|
|
__HEAT_SWITCH_BOARDS = {
|
|
'716-h1': ('syslab-33.syslab.dk', '8080', '716-h1'),
|
|
}
|
|
|
|
@staticmethod
|
|
def getAvailableHeatSwitchBoards():
|
|
return list(HeatSwitchBoard.__HEAT_SWITCH_BOARDS.keys())
|
|
|
|
|
|
def __init__(self, which=None, host=None, port=None, unitname=None):
|
|
|
|
|
|
baseurl = f'http://{host}:{port}/typebased_WebService_HeatSubstation/HeatSwitchboardWebService/{unit_name}/'
|
|
super().__init__(
|
|
baseurl=baseurl,
|
|
which=which,
|
|
units=self.__HEAT_SWITCH_BOARDS,
|
|
host=host,
|
|
port=port,
|
|
unit_name=unitname,
|
|
unit_type="HeatSwitchBoard")
|
|
|
|
# Inventory functions
|
|
|
|
#TODO Handle these in core/SYSLAB_unit.py by properly handling arrays. This is a bodge for now.
|
|
def getHeatMeters(self):
|
|
result = self._request_resource('getHeatMeters', check_types=False)
|
|
return result
|
|
|
|
#TODO, P1: Awaiting Valve[]
|
|
def getValves(self):
|
|
raise NotImplementedError
|
|
|
|
# Valve functions
|
|
|
|
def getValvePosition(self, valve) -> CompositeMeasurement:
|
|
return self._request_resource('getValvePosition', valve)
|
|
|
|
#TODO: Implement
|
|
#def setValvePosition(self, valve: str, position: float, timestamp=0):
|
|
def setValvePosition(self, valve: str, position: CompositeMeasurement):
|
|
"""
|
|
Sets *valve* to *position*. Position must be float in the
|
|
interval from 0.0 to 1.0
|
|
Position = 0.0 => *valve* fully closed
|
|
Position = 1.0 => *valve* fully open
|
|
"""
|
|
assert 0.0 <= position.value and position.value <= 1.0
|
|
return self._request_resource('setValvePosition', (valve), 'put',
|
|
position.parseToJSON())
|
|
#CompositeMeasurement(value=position, timestampMicros=timestamp).parseToJSON())
|
|
|
|
# Meter functions
|
|
|
|
def getBackTemperature(self, meter) -> CompositeMeasurement:
|
|
return self._request_resource('getBackTemperature', meter)
|
|
|
|
def getFlow(self, meter) -> CompositeMeasurement:
|
|
return self._request_resource('getFlow', meter)
|
|
|
|
def getThermalPower(self, meter) -> CompositeMeasurement:
|
|
return self._request_resource('getThermalPower', meter)
|
|
|
|
def getFwdTemperature(self, meter) -> CompositeMeasurement:
|
|
return self._request_resource('getFwdTemperature', meter)
|
|
|
|
def getPressure(self, meter) -> CompositeMeasurement:
|
|
return self._request_resource('getPressure', meter)
|
|
|
|
def getVolume(self, meter) -> CompositeMeasurement:
|
|
return self._request_resource('getVolume', meter)
|
|
|
|
def getMass(self, meter) -> CompositeMeasurement:
|
|
return self._request_resource('getMass', meter)
|
|
|
|
def getHeatEnergy(self, meter) -> CompositeMeasurement:
|
|
return self._request_resource('getHeatEnergy', meter)
|
|
|
|
def getCoolingEnergy(self, meter) -> CompositeMeasurement:
|
|
return self._request_resource('getCoolingEnergy', meter)
|
|
|
|
# Pump functions
|
|
|
|
def getPumpState(self, pump) -> HeatCirculationPumpState:
|
|
return self._request_resource('getPumpState', pump)
|
|
|
|
def getPumpControlMode(self, pump) -> HeatCirculationPumpMode:
|
|
return self._request_resource('getPumpControlMode', pump)
|
|
|
|
def setPumpControlMode(self, pump, mode: HeatCirculationPumpMode):
|
|
return self._request_resource('setPumpControlMode', (pump), 'put', mode.parseToJSON())
|
|
|
|
def setPumpMaxFlow(self, pump, limit: CompositeMeasurement):
|
|
return self._request_resource('setPumpMaxFlow', (pump), 'put', limit.parseToJSON())
|
|
|
|
def startPump(self, pump):
|
|
return self._request_resource('startPump', pump)
|
|
|
|
def stopPump(self, pump):
|
|
return self._request_resource('stopPump', pump)
|
|
|
|
#TODO: Split into three functions that check against current pump mode.
|
|
def setPumpSetpoint(self, pump, setpoint: CompositeMeasurement):
|
|
"""
|
|
Sets the target for the pump.
|
|
NOTE: How to interpret the setpoint depends on the mode which the pump is in.
|
|
Here be dragons.
|
|
"""
|
|
return self._request_resource('setPumpSetpoint', (pump), 'put', setpoint.parseToJSON())
|
|
|
|
def getPumpHead(self, pump) -> CompositeMeasurement:
|
|
return self._request_resource('getPumpHead', pump)
|
|
|
|
def getPumpFlow(self, pump) -> CompositeMeasurement:
|
|
return self._request_resource('getPumpFlow', pump)
|
|
|
|
def getPumpRPM(self, pump) -> CompositeMeasurement:
|
|
return self._request_resource('getPumpRPM', pump)
|
|
|
|
def getPumpRelPerformance(self, pump) -> CompositeMeasurement:
|
|
return self._request_resource('getPumpPerformance', pump)
|
|
|