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)