boost::optional<IdfObject> ForwardTranslator::translatePlantEquipmentOperationHeatingLoad( PlantEquipmentOperationHeatingLoad & modelObject )
{
  IdfObject idfObject(IddObjectType::PlantEquipmentOperation_HeatingLoad);
  m_idfObjects.push_back(idfObject);

  // Name
  auto name = modelObject.name().get();
  idfObject.setName(name);

  double lowerLimit = modelObject.minimumLowerLimit();
  int i = 1;
  for( auto upperLimit : modelObject.loadRangeUpperLimits() ) {
    auto equipment = modelObject.equipment(upperLimit);
    if( ! equipment.empty() ) {
      auto eg = idfObject.pushExtensibleGroup();
      eg.setDouble(PlantEquipmentOperation_HeatingLoadExtensibleFields::LoadRangeLowerLimit,lowerLimit);
      eg.setDouble(PlantEquipmentOperation_HeatingLoadExtensibleFields::LoadRangeUpperLimit,upperLimit);

      IdfObject equipmentList(IddObjectType::PlantEquipmentList);
      m_idfObjects.push_back(equipmentList);
      auto equipmentListName = name + " equipment list " + std::to_string(i);
      equipmentList.setName(equipmentListName);
      eg.setString(PlantEquipmentOperation_HeatingLoadExtensibleFields::RangeEquipmentListName,equipmentListName);

      for( auto component : equipment ) {
        
        // TODO: Find the right way to deal with this
        // For now, "dirty" (?) fix for Generator:MicroTurbine
        // @kbenne, FYI
        boost::optional<IdfObject> idf_component;

        if (boost::optional<GeneratorMicroTurbineHeatRecovery> mchpHR = component.optionalCast<GeneratorMicroTurbineHeatRecovery>())
        {
          GeneratorMicroTurbine mchp = mchpHR->generatorMicroTurbine();
          idf_component = translateAndMapModelObject(mchp);
        }
        else {
          idf_component = translateAndMapModelObject(component);
        }
        
        auto eg2 = equipmentList.pushExtensibleGroup();
        OS_ASSERT(idf_component);
        eg2.setString(PlantEquipmentListExtensibleFields::EquipmentObjectType,idf_component->iddObject().name());
        eg2.setString(PlantEquipmentListExtensibleFields::EquipmentName,idf_component->name().get());
      }
    }

    lowerLimit = upperLimit;
    ++i;
  }

  return idfObject;
}
boost::optional<IdfObject> ForwardTranslator::translatePlantEquipmentOperationOutdoorWetBulbDifference( PlantEquipmentOperationOutdoorWetBulbDifference & modelObject )
{
    IdfObject idfObject(IddObjectType::PlantEquipmentOperation_OutdoorWetBulbDifference);
    m_idfObjects.push_back(idfObject);

    // Name
    auto name = modelObject.name().get();
    idfObject.setName(name);

    // ReferenceTemperatureNodeName
    if( const auto & node = modelObject.referenceTemperatureNode() ) {
        idfObject.setString(PlantEquipmentOperation_OutdoorWetBulbDifferenceFields::ReferenceTemperatureNodeName,node->name().get());
    }

    double lowerLimit = modelObject.minimumLowerLimit();
    int i = 1;
    for( auto upperLimit : modelObject.loadRangeUpperLimits() ) {
        auto equipment = modelObject.equipment(upperLimit);
        if( ! equipment.empty() ) {
            auto eg = idfObject.pushExtensibleGroup();
            eg.setDouble(PlantEquipmentOperation_OutdoorWetBulbDifferenceExtensibleFields::WetBulbTemperatureDifferenceRangeLowerLimit,lowerLimit);
            eg.setDouble(PlantEquipmentOperation_OutdoorWetBulbDifferenceExtensibleFields::WetBulbTemperatureDifferenceRangeUpperLimit,upperLimit);

            IdfObject equipmentList(IddObjectType::PlantEquipmentList);
            m_idfObjects.push_back(equipmentList);
            auto equipmentListName = name + " equipment list " + std::to_string(i);
            equipmentList.setName(equipmentListName);
            eg.setString(PlantEquipmentOperation_OutdoorWetBulbDifferenceExtensibleFields::RangeEquipmentListName,equipmentListName);

            for( auto component : equipment ) {
                auto eg2 = equipmentList.pushExtensibleGroup();
                auto idf_component = translateAndMapModelObject(component);
                OS_ASSERT(idf_component);
                eg2.setString(PlantEquipmentListExtensibleFields::EquipmentObjectType,idf_component->iddObject().name());
                eg2.setString(PlantEquipmentListExtensibleFields::EquipmentName,idf_component->name().get());
            }
        }

        lowerLimit = upperLimit;
        ++i;
    }

    return idfObject;
}