46045-syslab/syslab-python/syslab/physical/HeatSwitchBoard.py

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)