| 113 | } |
| 114 | |
| 115 | boost::optional<OutputMeter> Facility_Impl::getMeterByFuelType(const FuelType& fuelType, const std::string& reportingFrequency, |
| 116 | const boost::optional<EndUseType>& endUseType, |
| 117 | const boost::optional<std::string>& specificEndUse) const { |
| 118 | OptionalOutputMeter result; |
| 119 | for (const OutputMeter& meter : this->meters()) { |
| 120 | if (meter.fuelType() && (meter.fuelType() == fuelType)) { |
| 121 | if (istringEqual(meter.reportingFrequency(), reportingFrequency)) { |
| 122 | OptionalEndUseType meterEndUseType = meter.endUseType(); |
| 123 | if ((!endUseType && !meterEndUseType) || (endUseType && meterEndUseType && (*meterEndUseType == *endUseType))) { |
| 124 | OptionalString meterSpecificEndUse = meter.specificEndUse(); |
| 125 | if ((!specificEndUse && !meterSpecificEndUse) |
| 126 | || (specificEndUse && meterSpecificEndUse && istringEqual(*meterSpecificEndUse, *specificEndUse))) { |
| 127 | if (result) { |
| 128 | LOG(Warn, "Found duplicate meters: " << result->name() << " and " << meter.name() << "."); |
| 129 | } else { |
| 130 | result = meter; |
| 131 | } |
| 132 | } |
| 133 | } |
| 134 | } |
| 135 | } |
| 136 | } |
| 137 | return result; |
| 138 | } |
| 139 | |
| 140 | std::vector<ExteriorLights> Facility_Impl::exteriorLights() const { |
| 141 | return model().getConcreteModelObjects<ExteriorLights>(); |