From b374317645d468e2019d79f3ddf30a186681c5a4 Mon Sep 17 00:00:00 2001
From: "VKMTHD\\franzjosefkober" <franz.josef.kober@ivt.tugraz.at>
Date: Thu, 27 May 2021 18:54:04 +0200
Subject: [PATCH] Added possibility to designate multiple passenger heat pumps

---
 .../BusAuxiliaries/ISSMDeclarationInputs.cs   | 10 +++
 .../InputData/DeclarationInputData.cs         |  5 +-
 .../InputData/FileIO/JSON/JSONSubComponent.cs |  4 +-
 ...MLDeclarationBusAuxiliariesDataProvider.cs | 62 ++++++++++++++-----
 .../XMLDeclarationMultistageInputReader.cs    | 34 ++--------
 ...larationDataAdapterCompletedBusSpecific.cs | 46 ++++++++------
 .../OutputData/XML/XMLMultistageBusReport.cs  | 26 ++++++--
 ...LMultistageBusConsolidatedInputDataTest.cs |  4 +-
 .../XML/XMLMultistageBusDataTest.cs           | 12 ++--
 .../XML/XMLMultistageBusInputDataTest.cs      |  8 ++-
 10 files changed, 128 insertions(+), 83 deletions(-)

diff --git a/VectoCommon/VectoCommon/BusAuxiliaries/ISSMDeclarationInputs.cs b/VectoCommon/VectoCommon/BusAuxiliaries/ISSMDeclarationInputs.cs
index c204b3e653..4ceecddbed 100644
--- a/VectoCommon/VectoCommon/BusAuxiliaries/ISSMDeclarationInputs.cs
+++ b/VectoCommon/VectoCommon/BusAuxiliaries/ISSMDeclarationInputs.cs
@@ -256,6 +256,11 @@ namespace TUGraz.VectoCommon.BusAuxiliaries
 			}
 		}
 
+		public static string GetLabel(this HeatPumpType type)
+		{
+			return GetLabel(type as HeatPumpType?);
+		}
+
         public static string GetName(this HeatPumpType type)
         {
             return type.ToString();
@@ -338,6 +343,11 @@ namespace TUGraz.VectoCommon.BusAuxiliaries
 				default: return null;
 			}
 		}
+
+		public static string GetLabel(this HeatPumpMode type)
+		{
+			return GetLabel(type as HeatPumpMode?);
+		}
 	}
 
 	public interface ISSMEngineeringInputs : ISSMInputs
diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
index 8e11b241c0..b54fd50bbd 100644
--- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
@@ -896,9 +896,8 @@ namespace TUGraz.VectoCommon.InputData
 		
 		HeatPumpMode? HeatPumpModeDriverCompartment { get; }
 
-		HeatPumpType? HeatPumpTypePassengerCompartment { get; }
-		
-		HeatPumpMode? HeatPumpModePassengerCompartment { get; }
+		IList<HeatPumpType> HeatPumpTypePassengerCompartments { get; }
+		IList<HeatPumpMode> HeatPumpModePassengerCompartments { get; }
 
 		Watt AuxHeaterPower { get; }
 
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONSubComponent.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONSubComponent.cs
index ad25de035d..581d2c72da 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONSubComponent.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONSubComponent.cs
@@ -714,8 +714,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
         public virtual BusHVACSystemConfiguration? SystemConfiguration { get; set; }
 		public virtual HeatPumpType? HeatPumpTypeDriverCompartment { get { return null; } }
 		public virtual HeatPumpMode? HeatPumpModeDriverCompartment { get { return null; } }
-		public virtual HeatPumpType? HeatPumpTypePassengerCompartment { get{ return null; } }
-		public virtual HeatPumpMode? HeatPumpModePassengerCompartment { get { return null; } }
+		public virtual IList<HeatPumpType> HeatPumpTypePassengerCompartments { get { return null; } }
+		public virtual IList<HeatPumpMode> HeatPumpModePassengerCompartments { get { return null; } }
 		public virtual Watt AuxHeaterPower { get { return null; } }
         public virtual bool? DoubleGlazing { get { return false; } }
 		public virtual bool HeatPump { get { return false; } }
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationBusAuxiliariesDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationBusAuxiliariesDataProvider.cs
index 6a22c683b4..988d466099 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationBusAuxiliariesDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationBusAuxiliariesDataProvider.cs
@@ -1,7 +1,5 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Linq;
-using System.Windows.Forms;
 using System.Xml;
 using System.Xml.Linq;
 using TUGraz.VectoCommon.BusAuxiliaries;
@@ -219,8 +217,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 		public virtual HeatPumpType? HeatPumpTypeDriverCompartment { get { return null; } }
 		public virtual HeatPumpMode? HeatPumpModeDriverCompartment { get { return null; } }
-		public virtual HeatPumpType? HeatPumpTypePassengerCompartment { get { return null; } }
-		public virtual HeatPumpMode? HeatPumpModePassengerCompartment { get { return null; } }
+		public virtual IList<HeatPumpType> HeatPumpTypePassengerCompartments { get { return null; } }
+		public virtual IList<HeatPumpMode> HeatPumpModePassengerCompartments { get { return null; } }
 
 		public virtual Watt AuxHeaterPower
 		{
@@ -394,8 +392,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		private bool IsBusHVACTagEmpty()
 		{
 			return SystemConfiguration == null && HeatPumpTypeDriverCompartment == null && HeatPumpModeDriverCompartment == null &&
-					HeatPumpTypePassengerCompartment == null && HeatPumpModePassengerCompartment == null && AuxHeaterPower == null &&
-					DoubleGlazing == null && AdjustableAuxiliaryHeater == null && SeparateAirDistributionDucts == null &&
+					HeatPumpTypePassengerCompartments?.Any() != true  && HeatPumpModePassengerCompartments?.Any() != true &&
+					AuxHeaterPower == null && DoubleGlazing == null && AdjustableAuxiliaryHeater == null && SeparateAirDistributionDucts == null && 
 					WaterElectricHeater == null && AirElectricHeater == null && OtherHeatingTechnology == null ;
 		}
 
@@ -436,28 +434,58 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 					? HeatPumpModeHelper.Parse(GetString(XMLNames.Bus_HeatPumpModeDriver)) : null;
 			}
 		}
-
-		public override HeatPumpType? HeatPumpTypePassengerCompartment
+		
+		public override IList<HeatPumpType> HeatPumpTypePassengerCompartments
 		{
-			get
+			get 
 			{
-				return ElementExists(XMLNames.Bus_HeatPumpTypePassenger)
-					? HeatPumpTypeHelper.Parse(GetString(XMLNames.Bus_HeatPumpTypePassenger)) : (HeatPumpType?)null;
+				return ElementExists(XMLNames.Bus_HeatPumpTypePassenger) 
+						? GetHeatPumpTypePassengerCompartments() : null;
 			}
 		}
+		
+		private IList<HeatPumpType> GetHeatPumpTypePassengerCompartments()
+		{
+			var pumpTypeNodes = GetNodes(XMLNames.Bus_HeatPumpTypePassenger);
+			if (pumpTypeNodes == null)
+				return null;
+
+			var pumpTypes = new List<HeatPumpType>();
 
-		public override HeatPumpMode? HeatPumpModePassengerCompartment
+			foreach (XmlNode pumpTypeNode in pumpTypeNodes) {
+				var entry = HeatPumpTypeHelper.Parse(pumpTypeNode?.InnerText);
+				pumpTypes.Add(entry);
+			}
+
+			return pumpTypes.Any() != true ? null : pumpTypes;
+		}
+		
+		public override IList<HeatPumpMode> HeatPumpModePassengerCompartments
 		{
 			get
 			{
-				if (HeatPumpTypePassengerCompartment == HeatPumpType.none && !ElementExists(XMLNames.Bus_HeatPumpModePassenger))
-					return HeatPumpMode.N_A;
-
 				return ElementExists(XMLNames.Bus_HeatPumpModePassenger)
-					? HeatPumpModeHelper.Parse(GetString(XMLNames.Bus_HeatPumpModePassenger)) : null;
+					? GetHeatPumpModePassengerCompartments() : null;
 			}
 		}
 
+		private IList<HeatPumpMode> GetHeatPumpModePassengerCompartments()
+		{
+			var pumpModeNodes = GetNodes(XMLNames.Bus_HeatPumpModePassenger);
+			if (pumpModeNodes == null)
+				return null;
+			
+			var pumpModes = new List<HeatPumpMode>();
+			foreach (XmlNode pumpMode in pumpModeNodes)
+			{
+				var entry = HeatPumpModeHelper.Parse(pumpMode?.InnerText);
+				if (entry != null)
+					pumpModes.Add((HeatPumpMode)entry);
+			}
+
+			return pumpModes.Any() != true ? null : pumpModes;
+		}
+		
 		public override Watt AuxHeaterPower
 		{
 			get
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs
index ca94ebd371..b4c92f45c0 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs
@@ -1215,19 +1215,20 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl
 			}
 		}
 
-		public HeatPumpType? HeatPumpTypePassengerCompartment
+		public IList<HeatPumpType> HeatPumpTypePassengerCompartments
 		{
 			get
 			{
-				return GetHVACBusAuxPropertyValue<HeatPumpType?>(nameof(HeatPumpTypePassengerCompartment));
+				return GetHVACBusAuxPropertyValue<IList<HeatPumpType>>(nameof(HeatPumpTypePassengerCompartments));
+
 			}
 		}
 
-		public HeatPumpMode? HeatPumpModePassengerCompartment
+		public IList<HeatPumpMode> HeatPumpModePassengerCompartments
 		{
 			get
 			{
-				return GetHVACBusAuxPropertyValue<HeatPumpMode?>(nameof(HeatPumpModePassengerCompartment));
+				return GetHVACBusAuxPropertyValue<IList<HeatPumpMode>>(nameof(HeatPumpModePassengerCompartments));
 			}
 		}
 
@@ -1310,28 +1311,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl
 		{
 			return SystemConfiguration != null && SystemConfiguration != BusHVACSystemConfiguration.Unknown;
 		}
-
-		private bool IsCorrectDriverPumpTypeDriverPumpMode()
-		{
-			if (HeatPumpModeDriverCompartment == null)
-				return false;
-
-			if (HeatPumpTypeDriverCompartment == HeatPumpType.none)
-				return HeatPumpModeDriverCompartment == null || HeatPumpModeDriverCompartment == HeatPumpMode.N_A;
-			
-			return HeatPumpTypeDriverCompartment != null && HeatPumpModeDriverCompartment != null;
-		}
-
-		private bool IsCorrectPassengerPumpTypeDriverPumpMode()
-		{
-			if (HeatPumpTypePassengerCompartment == null)
-				return false;
-			if (HeatPumpTypePassengerCompartment == HeatPumpType.none)
-				return HeatPumpModePassengerCompartment == null || HeatPumpModePassengerCompartment == HeatPumpMode.N_A;
-
-			return HeatPumpTypePassengerCompartment != null && HeatPumpModePassengerCompartment != null;
-		}
-
+		
 		private bool RequiredParametersForJobType(VectoSimulationJobType jobType)
 		{
 			switch (jobType) {
@@ -1349,8 +1329,6 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl
 		public override bool IsInputDataComplete(VectoSimulationJobType jobType)
 		{
 			return InputComplete(IsCorrectSystemConfiguration(), nameof(IsCorrectSystemConfiguration))
-					&& InputComplete(IsCorrectDriverPumpTypeDriverPumpMode(), nameof(IsCorrectDriverPumpTypeDriverPumpMode))
-					&& InputComplete(IsCorrectPassengerPumpTypeDriverPumpMode(), nameof(IsCorrectPassengerPumpTypeDriverPumpMode))
 					&& InputComplete(AuxHeaterPower, nameof(AuxHeaterPower))
 					&& InputComplete(DoubleGlazing, nameof(DoubleGlazing))
 					&& InputComplete(AdjustableAuxiliaryHeater, nameof(AdjustableAuxiliaryHeater))
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusSpecific.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusSpecific.cs
index 35ec26a9c3..8773b7b6d6 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusSpecific.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusSpecific.cs
@@ -190,10 +190,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			if (hvacConfiguration.RequiresDriverAC() && (!busAux.HeatPumpTypeDriverCompartment.HasValue || busAux.HeatPumpTypeDriverCompartment == HeatPumpType.none)) {
 				throw new VectoException("HVAC System Configuration {0} requires DriverAC Technology", hvacConfiguration);
 			}
-
-			if (hvacConfiguration.RequiresPassengerAC() && (!busAux.HeatPumpTypePassengerCompartment.HasValue || busAux.HeatPumpTypePassengerCompartment == HeatPumpType.none)) {
-				throw new VectoException("HVAC System Configuration {0} requires PassengerAC Technology", hvacConfiguration);
-			}
+			//ToDo FK HeatPumpMode error check
+			//if (hvacConfiguration.RequiresPassengerAC() && (!busAux.HeatPumpTypePassengerCompartment.HasValue || busAux.HeatPumpTypePassengerCompartment == HeatPumpType.none)) {
+			//	throw new VectoException("HVAC System Configuration {0} requires PassengerAC Technology", hvacConfiguration);
+			//}
 
 			if (mission.BusParameter.SeparateAirDistributionDuctsHVACCfg.Contains(hvacConfiguration) &&
 				(busAux.SeparateAirDistributionDucts == null || !busAux.SeparateAirDistributionDucts.Value)) {
@@ -210,24 +210,28 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			if (busAux.HeatPumpTypeDriverCompartment == null) {
 				throw new VectoException("HeatPumpTypeDriverCompartment input parameter is required");
 			}
-			if (busAux.HeatPumpTypePassengerCompartment == null) {
+			if (busAux.HeatPumpTypePassengerCompartments == null) {
 				throw new VectoException("HeatPumpTypePassengerCompartment input parameter is required");
 			}
 			if (busAux.HeatPumpModeDriverCompartment == null || (busAux.HeatPumpTypeDriverCompartment != HeatPumpType.none && busAux.HeatPumpModeDriverCompartment.Value == HeatPumpMode.N_A)) {
 				throw new VectoException("HeatPumpTypeDriverCompartment input parameter is required");
 			}
-			if (busAux.HeatPumpModePassengerCompartment == null || (busAux.HeatPumpTypePassengerCompartment != HeatPumpType.none && busAux.HeatPumpModePassengerCompartment.Value == HeatPumpMode.N_A)) {
-				throw new VectoException("HeatPumpModePassengerCompartment input parameter is required");
-			}
+
+			//ToDo FK HeatPumpMode error check
+			//if (busAux.HeatPumpModePassengerCompartments == null || (busAux.HeatPumpTypePassengerCompartment != HeatPumpType.none && busAux.HeatPumpModePassengerCompartment.Value == HeatPumpMode.N_A)) {
+			//	throw new VectoException("HeatPumpModePassengerCompartment input parameter is required");
+			//}
 
 			var heatPumpTypeDriverCompartment =
 				busAux.HeatPumpModeDriverCompartment == HeatPumpMode.heating
 					? HeatPumpType.none
 					: busAux.HeatPumpTypeDriverCompartment.Value;
-			var heatPumpTypePassengerCompartment =
-				busAux.HeatPumpModePassengerCompartment == HeatPumpMode.heating
-					? HeatPumpType.none
-					: busAux.HeatPumpTypePassengerCompartment.Value;
+
+			//ToDo FK HeatPumpMode for calculation COP
+			//var heatPumpTypePassengerCompartment =
+			//	busAux.HeatPumpModePassengerCompartment == HeatPumpMode.heating
+			//		? HeatPumpType.none
+			//		: busAux.HeatPumpTypePassengerCompartment.Value;
 
 			var internalLength = hvacConfiguration == BusHVACSystemConfiguration.Configuration2
 				? 2 * Constants.BusParameters.DriverCompartmentLength // OK
@@ -265,14 +269,16 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			ssmInputs.VentilationRateHeating = DeclarationData.BusAuxiliaries.VentilationRate(hvacConfiguration, true);
 
 			ssmInputs.HVACMaxCoolingPower = coolingPower.Item1 + coolingPower.Item2;
-			ssmInputs.HVACCompressorType = heatPumpTypePassengerCompartment; // use passenger compartment
-			ssmInputs.HVACTechnology = string.Format(
-				"{0} ({1})", busAux.SystemConfiguration.GetName(),
-				string.Join(", ", new[] { heatPumpTypePassengerCompartment.GetName(), heatPumpTypeDriverCompartment.GetName() }));
-			;
-			ssmInputs.COP = DeclarationData.BusAuxiliaries.CalculateCOP(
-				coolingPower.Item1, heatPumpTypeDriverCompartment, coolingPower.Item2, heatPumpTypePassengerCompartment,
-				floorType);
+
+			//ToDo FK COP calculation
+			//ssmInputs.HVACCompressorType = heatPumpTypePassengerCompartment; // use passenger compartment
+			//ssmInputs.HVACTechnology = string.Format(
+			//	"{0} ({1})", busAux.SystemConfiguration.GetName(),
+			//	string.Join(", ", new[] { heatPumpTypePassengerCompartment.GetName(), heatPumpTypeDriverCompartment.GetName() }));
+			//;
+			//ssmInputs.COP = DeclarationData.BusAuxiliaries.CalculateCOP(
+			//	coolingPower.Item1, heatPumpTypeDriverCompartment, coolingPower.Item2, heatPumpTypePassengerCompartment,
+			//	floorType);
 
 			return ssmInputs;
 		}
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLMultistageBusReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLMultistageBusReport.cs
index 90ff95329f..07987be178 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLMultistageBusReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLMultistageBusReport.cs
@@ -447,7 +447,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 
 			if (hvac.SystemConfiguration == null &&
 				hvac.HeatPumpModeDriverCompartment == null && hvac.HeatPumpTypeDriverCompartment == null &&
-				hvac.HeatPumpModePassengerCompartment == null && hvac.HeatPumpTypePassengerCompartment == null &&
+				hvac.HeatPumpModePassengerCompartments?.Any() != true && hvac.HeatPumpTypePassengerCompartments?.Any() != true &&
 				hvac.AuxHeaterPower == null && hvac.DoubleGlazing == null && hvac.AdjustableAuxiliaryHeater == null &&
 				hvac.SeparateAirDistributionDucts == null && hvac.WaterElectricHeater == null &&
 				hvac.AirElectricHeater == null &&
@@ -461,10 +461,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 					? new XElement(v28 + XMLNames.Bus_HeatPumpTypeDriver, hvac.HeatPumpTypeDriverCompartment.GetLabel()) : null,
 				hvac.HeatPumpModeDriverCompartment != null
 					? new XElement(v28 + XMLNames.Bus_HeatPumpModeDriver, hvac.HeatPumpModeDriverCompartment.GetLabel()) : null,
-				hvac.HeatPumpTypePassengerCompartment != null
-					? new XElement(v28 + XMLNames.Bus_HeatPumpTypePassenger, hvac.HeatPumpTypePassengerCompartment.GetLabel()) : null,
-				hvac.HeatPumpModePassengerCompartment != null
-					? new XElement(v28 + XMLNames.Bus_HeatPumpModePassenger, hvac.HeatPumpModePassengerCompartment.GetLabel()) : null,
+				GetHeatPumpPassengerCompartments(hvac.HeatPumpTypePassengerCompartments, hvac.HeatPumpModePassengerCompartments),
 				hvac.AuxHeaterPower != null
 					? new XElement(v28 + XMLNames.Bus_AuxiliaryHeaterPower, hvac.AuxHeaterPower.ToXMLFormat(0)) : null,
 				hvac.DoubleGlazing != null
@@ -481,6 +478,25 @@ namespace TUGraz.VectoCore.OutputData.XML
 					? new XElement(v28 + XMLNames.Bus_OtherHeatingTechnology, hvac.OtherHeatingTechnology) : null
 			);
 		}
+		
+		private IList<XElement> GetHeatPumpPassengerCompartments(IList<HeatPumpType> pumpTypes, IList<HeatPumpMode> pumpModes)
+		{
+			if (pumpTypes?.Any() != true || pumpModes?.Any() != true)
+				return null;
+
+			if (pumpTypes.Count != pumpModes.Count)
+				return null;
+
+			var result = new List<XElement>();
+
+			for (int i = 0; i < pumpTypes.Count; i++) {
+				result.Add(new XElement(v28 + XMLNames.Bus_HeatPumpTypePassenger, pumpTypes[i].GetLabel()));
+				result.Add(new XElement(v28 + XMLNames.Bus_HeatPumpModePassenger, pumpModes[i].GetLabel()));
+			}
+
+			return result;
+		}
+
 
 		private XElement GetApplicationInformation()
 		{
diff --git a/VectoCore/VectoCoreTest/XML/XMLMultistageBusConsolidatedInputDataTest.cs b/VectoCore/VectoCoreTest/XML/XMLMultistageBusConsolidatedInputDataTest.cs
index 29cace4f5b..cf6a7a7c1f 100644
--- a/VectoCore/VectoCoreTest/XML/XMLMultistageBusConsolidatedInputDataTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLMultistageBusConsolidatedInputDataTest.cs
@@ -92,8 +92,8 @@ namespace TUGraz.VectoCore.Tests.XML
 			Assert.AreEqual(BusHVACSystemConfiguration.Configuration1, busHVACAux.SystemConfiguration);
 			Assert.AreEqual(HeatPumpType.non_R_744_2_stage, busHVACAux.HeatPumpTypeDriverCompartment);
 			Assert.AreEqual(HeatPumpMode.heating, busHVACAux.HeatPumpModeDriverCompartment);
-			Assert.AreEqual(HeatPumpType.non_R_744_3_stage, busHVACAux.HeatPumpTypePassengerCompartment);
-			Assert.AreEqual(HeatPumpMode.cooling, busHVACAux.HeatPumpModePassengerCompartment);
+			Assert.AreEqual(HeatPumpType.non_R_744_3_stage, busHVACAux.HeatPumpTypePassengerCompartments[0]);
+			Assert.AreEqual(HeatPumpMode.cooling, busHVACAux.HeatPumpModePassengerCompartments[0]);
 			Assert.AreEqual(50, busHVACAux.AuxHeaterPower.Value());
 			Assert.AreEqual(false, busHVACAux.DoubleGlazing);
 			Assert.AreEqual(true, busHVACAux.AdjustableAuxiliaryHeater);
diff --git a/VectoCore/VectoCoreTest/XML/XMLMultistageBusDataTest.cs b/VectoCore/VectoCoreTest/XML/XMLMultistageBusDataTest.cs
index 6495c59d2b..f90cb017a4 100644
--- a/VectoCore/VectoCoreTest/XML/XMLMultistageBusDataTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLMultistageBusDataTest.cs
@@ -632,8 +632,10 @@ namespace TUGraz.VectoCore.Tests.XML
 			Assert.AreEqual(BusHVACSystemConfiguration.Configuration1, hvacAux.SystemConfiguration);
 			Assert.AreEqual(HeatPumpType.non_R_744_2_stage, hvacAux.HeatPumpTypeDriverCompartment);
 			Assert.AreEqual(HeatPumpMode.heating, hvacAux.HeatPumpModeDriverCompartment);
-			Assert.AreEqual(HeatPumpType.non_R_744_3_stage, hvacAux.HeatPumpTypePassengerCompartment);
-			Assert.AreEqual(HeatPumpMode.cooling, hvacAux.HeatPumpModePassengerCompartment);
+			Assert.AreEqual(1, hvacAux.HeatPumpTypePassengerCompartments.Count);
+			Assert.AreEqual(1, hvacAux.HeatPumpModePassengerCompartments.Count);
+			Assert.AreEqual(HeatPumpType.non_R_744_3_stage, hvacAux.HeatPumpTypePassengerCompartments[0]);
+			Assert.AreEqual(HeatPumpMode.cooling, hvacAux.HeatPumpModePassengerCompartments[0]);
 			Assert.AreEqual(50.SI<Watt>(), hvacAux.AuxHeaterPower);
 			Assert.AreEqual(false, hvacAux.DoubleGlazing);
 			Assert.AreEqual(true, hvacAux.AdjustableAuxiliaryHeater);
@@ -747,8 +749,10 @@ namespace TUGraz.VectoCore.Tests.XML
 			Assert.AreEqual(BusHVACSystemConfiguration.Configuration0, hvacAux.SystemConfiguration);
 			Assert.AreEqual(HeatPumpType.non_R_744_3_stage, hvacAux.HeatPumpTypeDriverCompartment);
 			Assert.AreEqual(HeatPumpMode.heating, hvacAux.HeatPumpModeDriverCompartment);
-			Assert.AreEqual(HeatPumpType.non_R_744_2_stage, hvacAux.HeatPumpTypePassengerCompartment);
-			Assert.AreEqual(HeatPumpMode.heating, hvacAux.HeatPumpModePassengerCompartment);
+			Assert.AreEqual(1, hvacAux.HeatPumpTypePassengerCompartments.Count);
+			Assert.AreEqual(1, hvacAux.HeatPumpModePassengerCompartments.Count);
+			Assert.AreEqual(HeatPumpType.non_R_744_2_stage, hvacAux.HeatPumpTypePassengerCompartments[0]);
+			Assert.AreEqual(HeatPumpMode.heating, hvacAux.HeatPumpModePassengerCompartments[0]);
 			Assert.AreEqual(40.SI<Watt>(), hvacAux.AuxHeaterPower);
 			Assert.AreEqual(false, hvacAux.DoubleGlazing);
 			Assert.AreEqual(false, hvacAux.AdjustableAuxiliaryHeater);
diff --git a/VectoCore/VectoCoreTest/XML/XMLMultistageBusInputDataTest.cs b/VectoCore/VectoCoreTest/XML/XMLMultistageBusInputDataTest.cs
index ca78088966..d98dd858cf 100644
--- a/VectoCore/VectoCoreTest/XML/XMLMultistageBusInputDataTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLMultistageBusInputDataTest.cs
@@ -112,8 +112,12 @@ namespace TUGraz.VectoCore.Tests.XML
 			Assert.AreEqual(BusHVACSystemConfiguration.Configuration0, hvacAux.SystemConfiguration);
 			Assert.AreEqual(HeatPumpType.none, hvacAux.HeatPumpTypeDriverCompartment);
 			Assert.AreEqual(HeatPumpMode.heating, hvacAux.HeatPumpModeDriverCompartment);
-			Assert.AreEqual(HeatPumpType.non_R_744_2_stage, hvacAux.HeatPumpTypePassengerCompartment);
-			Assert.AreEqual(HeatPumpMode.cooling, hvacAux.HeatPumpModePassengerCompartment);
+			Assert.AreEqual(2, hvacAux.HeatPumpTypePassengerCompartments.Count);
+			Assert.AreEqual(2, hvacAux.HeatPumpModePassengerCompartments.Count);
+			Assert.AreEqual(HeatPumpType.non_R_744_2_stage, hvacAux.HeatPumpTypePassengerCompartments[0]);
+			Assert.AreEqual(HeatPumpMode.cooling, hvacAux.HeatPumpModePassengerCompartments[0]);
+			Assert.AreEqual(HeatPumpType.non_R_744_3_stage, hvacAux.HeatPumpTypePassengerCompartments[1]);
+			Assert.AreEqual(HeatPumpMode.heating, hvacAux.HeatPumpModePassengerCompartments[1]);
 			Assert.AreEqual(50, hvacAux.AuxHeaterPower.Value());
 			Assert.AreEqual(false, hvacAux.DoubleGlazing);
 			Assert.AreEqual(true, hvacAux.AdjustableAuxiliaryHeater);
-- 
GitLab